Умный дом: Domoticz.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 17 сен 2017.

Метки:
  1. ИгорьК

    ИгорьК Давно здесь Команда форума

    Напишите idx - названия датчиков. Позже сделаю.
     
  2. Sem2000

    Sem2000 Нуб

    Датчик протечки -- idx 25 -- Имя:Протечка постирочная
    Розетка перекрыть -- idx 10 -- Имя:Розетка перекрыть воду

    Датчик балкон -- idx 6 -- Имя:Температура балкон
    Розетка обогрев-- idx 9 -- Имя:Розетка обогрев
     
  3. ИгорьК

    ИгорьК Давно здесь Команда форума


    Делаем это через dzVents :
    upload_2018-11-20_13-1-6.png

    Протечка:

    Код (Lua):
    return {
    -- Датчик протечки   -- idx 25
    -- Розетка перекрыть -- idx 10
        on = {
            devices = {25},
        },
        execute = function(domoticz, device)
            if domoticz.devices(25).state == 'On'  then
                domoticz.devices(10).switchOn().forMin(1)
                domoticz.notify('Протечка!', 'Сработка датчика протечки, вода перекрыта!')
            end

        end
    }

    Балкон:

    Код (Lua):
    return {
        on = {
            devices = {
                6 -- Датчик температуры балкона
            }
        },
        -- 9 - розетка балкона
        execute = function(domoticz, device)
            if domoticz.devices(6).temperature < 10 and domoticz.devices(9).state == 'Off'  then
                domoticz.devices(9).switchOn()
                domoticz.notify('Балкон!', 'Обогрев Включен.')
            end
            if domoticz.devices(6).temperature > 15 and domoticz.devices(9).state == 'On'  then
                domoticz.devices(9).switchOff()
                domoticz.notify('Балкон!', 'Обогрев Выключен.')
            end

    end
    }
     
    Arturs и Egony нравится это.
  4. Sem2000

    Sem2000 Нуб

    Спасибо!!!!!!!!
     
  5. Доброго времени суток! Прошу помощи в решении моей проблемы!
    Проблема в следующем: не могу в скрипте LUA обновить два устройства.
    Поставил себе датчик расхода воды, LUA скрипт взял из буржуйского форума. Но оказалось, что устройство подсчитывает расход, но не подсчитывает общий расход (общий расход - это количество оборотов в датчике). Создал виртуальный датчик и вписал его в LUA скрипт. Но оказалось, что обновить получается только один из двух.
    счетчики.jpg отчет.jpg
    Код (Text):
    commandArray = {}

    -- Добовляем IDX of Водосчетчика
    iIDX = 56
    -- Добовляем IDX виртуального Водомера
    mIDX = 75
    -- Установите Watermeter на основе пользовательской переменной "WaterMeter"
    if ( uservariables["WaterMeter"] > 0 ) then
        print("ВОДА ввод данных " .. uservariables["WaterMeter"] / 1000 .. "m3 от пользователя")
        commandArray['UpdateDevice'] = ''..iIDX..'|0|'..uservariables["WaterMeter"]..''
        -- os.execute('curl "http://192.168.12.101:8080/json.htm?param=udevice&type=command&idx=43&svalue='.. uservariables["WaterMeter"] / 1000 ..'"')
        commandArray['Variable:WaterMeter'] = tostring(0)
    end

    -- Использование воды
    -- Берем значение из устройства водомера:
    sWaterUsage = otherdevices_svalues['Вода']
    sWaterUsage1 = otherdevices_svalues['Водомер']
    -- Чтобы получить более читаемый формат, разделите число на 1000:

    --sWaterUsagePrint = (tonumber(sWaterUsage) / 1000);
    sWaterUsagePrint = (tonumber(sWaterUsage) / 37900);
    --sWaterUsage1Print = (tonumber(sWaterUsage) / 37900);
    -- расчет производится с немодифицированными данными воды
    sWaterUsage = tonumber(sWaterUsage);
    --sWaterUsage1 = tonumber(sWaterUsage);

    -- Для отладки
    -- print("Water usage until now is " .. sWaterUsagePrint .. "m3 ")
    --print("Вода ОТЛАДКА Данные по водомеру " .. sWaterUsage1Print .. "m3 ")
    -- print('GPIO Watermeter = '..otherdevices['GPIO Watermeter'])

    function timedifference(s)
       year = string.sub(s, 1, 4)
       month = string.sub(s, 6, 7)
       day = string.sub(s, 9, 10)
       hour = string.sub(s, 12, 13)
       minutes = string.sub(s, 15, 16)
       seconds = string.sub(s, 18, 19)
       t1 = os.time()
       t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
       difference = os.difftime (t1, t2)
       return difference
    end

    if (devicechanged['GPIO Watermeter'] == 'Off')
    then
        sWaterUsageTot = (sWaterUsage + 0.5)
     
    -- отображает показание счетчика в журнале
        --print("Использование воды  " .. sWaterUsageTot / 1000 .. "m3 ")
        print("ВОДА Использование воды  " .. sWaterUsageTot / 37900 .. "m3 ")
        commandArray['UpdateDevice'] = ''..iIDX..'|0|'..sWaterUsageTot..''
     
        -- Обновляем данные по водомеру
        -- не могу обновить оба устройства обновляется или iIDX или mIDX
       -- sWaterUsageTot1=(sWaterUsageTot/37900)
       -- commandArray['UpdateDevice'] = ''..mIDX..'|0|'..sWaterUsageTot1..''

        -- os.execute('curl "http://192.168.12.101:8084/json.htm?param=udevice&type=command&idx=43&svalue='..sWaterUsageTot..'"')
    else
        -- Хранить живое устройство
        if (timedifference(otherdevices_lastupdate["Вода"]) > 3600)
        then
         -- print("Датчик не обновляется - использование воды по-прежнему " .. sWaterUsage / 1000 .. "m3 ")
          print("ВОДА Датчик не обновляется - использование воды по-прежнему " .. sWaterUsage / 37900 .. "m3 ")
          commandArray['UpdateDevice'] = ''..iIDX..'|0|'..sWaterUsage..''
         --  os.execute('curl "http://192.168.12.XXX:101/json.htm?param=udevice&type=command&idx=43&svalue='..sWaterUsage..'"')
        end

     
    end

    return commandArray
     

    Вложения:

    • Отчет2.jpg
      Отчет2.jpg
      Размер файла:
      182,9 КБ
      Просмотров:
      150
    Последнее редактирование: 20 ноя 2018
  6. Павел К

    Павел К Нерд

    Всем Доброго времени.
    Может быть у вас, товарищи, найдется ответ на мой вопрос.
    Видно, что люди тут читают опытные, поэтому попробую)

    Проблема следующая:

    DS18B20 --> Arduino --> OrangePi --> MQTT --> Node-red --> Domoticz.
    периодически шлет показания в виде -127 градусов.

    (хотя способ получения не особо важен. -127 пролетают и на этапе Arduino)
    [​IMG]

    Заранее признателен за попытки докопаться до истины.
     
  7. -127 это код ошибки библиотеки 18b20
    документацию надо читать внимательно
     
  8. Павел К

    Павел К Нерд

    Благодарю за наводку.
    Действительно в библиотеке указано // Error Codes #define DEVICE_DISCONNECTED -127

    Странно, почему он иногда отваливается.
    Возможно попался брак и стоит попробовать подключить на это место другой датчик.
     
  9. Проводка ловит помехи.
     
  10. ИгорьК

    ИгорьК Давно здесь Команда форума

    Это что такое - в каком виде он шлет данные? Что за тип устройства.

    Думаете, это понятно?

    Опишите просто словами - что должен делать этот скрипт.
     
  11. ИгорьК

    ИгорьК Давно здесь Команда форума

    ННННииииинавижу библиотеку Далласа!!!! Никогда с ней не работал - пишу все сам.
    У меня если сбой crc - ничего не возвращается и запроса, кроме (в некоторых случаях) отдельного сообщения об ошибке. Привык, типа так и должно быть.

    Приобрел тут устройство, подключил DS18b20. Оно периодически шлет эти -127.

    Какую, б..., документацию читать??? В документации на датчеГ этого нет!!! И я же не знаю, что производитель настолько туп, что в промышленное устройство втыкает эту уe...ю библиотку!!!!!

    Спасибо тебе, добрый человек, теперь я понял что не работает - голова у производителя!

    Ясный пень - теперь надо блокировать эти -127 на уровне Node Red (в моем случае).
     
  12. Павел К

    Павел К Нерд

    Вам хорошо))) Сам пишете!
    а я в школе когда паскаль учил - уроки те прогуливал))
    Вот когда за ум взялся, на дворе уже во всю явалуапитон и прочие си!
    так что приходится теперь побираться по интернету в поисках библиотек с наименьшим количеством строчек кода, по типу НЕНАВИСТНОЙ вам Далластемпература.h )

    О! А вот тут, можете чуть подробнее? как то мне это решение в голову не приходило. (выше по тексту понятно почему)

    На самом же деле эти -127 в короткий промежуток времени, погоды не делают, но вот в журналах домотикз бесят)
    В моём конкретном случае это скорее всего наводки-проводки.
     
  13. ИгорьК

    ИгорьК Давно здесь Команда форума

    Ну да. Температуру фиг поймешь.

    upload_2018-11-21_9-53-11.png

    Но я не блокировал, пытаясь понять что не работает. И никаких мыслей... А тут вон как просто....

    Позже уточню что сделаю в Node Red и выложу.
     
  14. Павел К

    Павел К Нерд

    Если по простому, думаю и так сойдет)
    По крайней мере Домотикз уже больше никогда не увидит эти несчастные -127

    Спасибо за подсказку)

    [​IMG]
     
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Давно здесь Команда форума

    Можно и так, но помните, что данные идут не в цифровом, а в текстовом формате, следовательно проверять надо не на число -127, а на текст "-127", поэтому '>=' не прокатит.

    Иначе делать это в функции, с переводом стринга в число.
     
  16. ИгорьК

    ИгорьК Давно здесь Команда форума

    Предотвращаю выкатывание температуры -127 и 85:

    upload_2018-11-21_10-45-27.png

    upload_2018-11-21_10-47-10.png

    upload_2018-11-26_14-54-26.png

    Код (Javascript):
    var idx = 145;
    if (msg.payload == '-127' || msg.payload == '85') return null;
    var newMsg = msg.payload;
    msg.payload = '{"idx":' + idx + ',"nvalue":' + 0 + ',"svalue":"'+newMsg+'"}';
    return msg;

    upload_2018-11-21_10-47-33.png

    UPD. Лучше от -127 защищаться так:

    Код (Javascript):
    var idx = 145;
    var dat = Number(msg.payload) || -127
    if (dat < -120 || dat > 84) return null;
    var newMsg = msg.payload;
    msg.payload = '{"idx":' + idx + ',"nvalue":' + 0 + ',"svalue":"'+newMsg+'"}';
    return msg;
     
    Последнее редактирование: 26 ноя 2018
  17. Павел К

    Павел К Нерд

    Вот говорю же хорошо, когда писать умеете)) Компактно всё так!

    я так сделал. Вроде работает)

    [​IMG]

    Вот чем меня Node-red очень привлекает, так это своей гибкостью реализации.
     
    ИгорьК нравится это.
  18. Sem2000

    Sem2000 Нуб

    Уважаемый Игорь, в моем случае значение температур 10 и 15 указаны в градусах по цельсию ?
    Чет не срабатывает. Перехожу на михоум все крутится, останавливаю михоумный сценарий, запускаю этот скрипт на домотиксе - тишина и обогреватель не включается.
    Я так картошку заморожу и с голоду помру )))
     
  19. ИгорьК

    ИгорьК Давно здесь Команда форума

    Гыыыыыы....

    Лог ошибки покажите

    Ну таки зачем вам Домотикз?
     
  20. Sem2000

    Sem2000 Нуб

    Как-то особо заботят меня эти китайские сервера и работа через них. Какая-то ненадежность временами. Порой сложно достучаться до своего оборудования, хотя канал жирный и качественный.
     

    Вложения:

    • Лог.txt
      Размер файла:
      34,1 КБ
      Просмотров:
      91