NooLite — диммирование из OpenHab.

Итак, в прошлом материале мы  успешно соединили все элементы nooLite и научились управлять ими через OpenHab. Однако вопрос касался лишь одного из двух возможных режимов работы: включено/выключено.

Режим диммирования также присутствует в силовом блоке SU111-300. Этот режим позволяет плавно менять  яркость силового блока.

Чтобы включить этот режим, блок следует «допилить «:

su111300Теперь блок:

  • будет интерпретировать команду 5, поступающую от пульта управления, как команду, на плавное изменение света  в противоположное от предыдущего сторону;
  • при получении от пульта команды 10 — останавливать выполнение команды 5;
  • Команда 4 интерпретируется как переключение on/off , но для положения «включено» яркость будет устанавливаться не полностью, а в то состояние, в котором находилась до выключения;

Дополнительно к этому, с учетом, нашего скрипта управления, мы можем через MT1132 подавать на силовой блок команды от 32 до 155, которые будут интерпретироваться как прямые команды установки определенного уровня яркости.

Проблемой во всей этой истории является то, что очень  сложно, через приемник RX2164, понять конечное состояние силового блока, когда он получает команду 5/10 (изменить яркость и остановить изменение).

Полагаю, не стоит этим и заморачиваться. В нашем случае сделаем лишь одностороннее управление силовым блоком от OpenHab.

Итак, создаем два item:

Dimmer NooDimmer01     "Noolite [%d %%]"
Number NooCommander01 "NooCommander [%d ]" <noolite> {exec="*:python3 /root/myprog/noolitedim.py %2$s"}

Помещаем их на sitemap:

Slider item=NooDimmer01 switchSupport
Text item=NooCommander01

И пишем правило в nolite.rules, который наряду с прошлыми манипуляциями будет таким:

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

var Timer timerNoolite01 = null

rule "change noolite"

when
        Item NooliteP received update 4 or
        Item NooliteP received update 5
        
then 
            
        if (Noolite.state == OFF) {
            Noolite.state = ON
    }
    else {
        Noolite.state = OFF
    }
end 

rule "change nooLite brightness" // Наше новое правило

when
     Item NooDimmer01 changed   // Если мы переместили слайдер
then
     var double toNoolite01    // Создаем пару переменных
     var Number commandToNoolite01
    
    if (timerNoolite01 != null) // Запускаем таймер и ждем три секунды, чтобы не реагировать сразу
           timerNoolite.cancel()
           timerNoolite = createTimer(now.plusSeconds(3)) [|
           {    // Превращаем показания слайдера в значение типа float
                toNoolite01=(NooDimmer01.state as DecimalType).doubleValue 
        if (toNoolite01 != 0) { // И если это не ноль трансформируем значения из ряда 1-100
                                        //  в значение из ряда 36 - 156, чтобы их принял наш скрипт
            var Number commandToNoolite01 = ((toNoolite01 * 1.21) + 35).intValue
                                        // Отправляем команды
            sendCommand(NooCommander01, commandToNoolite01)
            postUpdate(NooCommander01, commandToNoolite01)
        }
        else { // Иначе отправляем команду 0
            commandToNoolite01 = 0
            sendCommand(NooCommander01, commandToNoolite01)
            postUpdate(NooCommander01, commandToNoolite01)
        }
           }
        ]
end

Все пояснения в коде, который решает задачу перевода значения слайдера из ряда значений 0-100 в ряд 35-156, поскольку именно этот ряд нужен скрипту и силовому блоку для установки яркости.
А это скрипт noolitedim.py. Таких файлов надо иметь по штуке под каждый силовой блок. Дело в том, что OpenHab передает в exec биндинг лишь один аргумент без существенных танцев с бубном. И, поскольку, на каждую диммируемую лампу нужно иметь свой слайдер - добавление индивидуального скрипта задачу сильно не усложнит.

#-*-coding=utf-8-*-
import serial
import sys
ser = serial.Serial("/dev/ttyAMA0", baudrate=9600)
command = [85,80,6,1,0,0,0,0,0,0,0,170]
command[5] = 0 # Это канал, под каждый канал нужен свой скрипт
command[6] = int(sys.argv[1]) # Значение яркости
check = 0
for i in range(0, 10):
 check += command[i]
check = check & 0xFF
#print(check)
command[10] = check
#print(command)
tmpBuffer = bytearray(command)
ser.write(tmpBuffer)
ser.close()
# it works

И теперь — видео, как все должно работать:

Посмотрели? А теперь — световой будильник.

NooLite — диммирование из OpenHab.: 4 комментария

    1. Синхронизировано. И НооЛайт здесь не причем. У него все очень быстро работает.
      1. Съемка идет через камеру (и все железо находится там), которая находится в 70 км. от компа, на котором делаю видео.
      2. Особенность OpenHab в том, что каждое движение полозка генерит управляющую команду. Чтобы этого не происходило, в скрипте есть строка timerNoolite = createTimer(now.plusSeconds(3)). Вот Вам и задержка три секунды.
      Строка целенаправленно тормозит отправку команды на nooLite, чтобы не забивать эфир.
      Вы можете уменьшить до 1 секунды, а можете отказаться вообще от этого трюка. Но тогда каждое перемещение полозка на миллиметр будет посылать на исполнительное устройство пачку импульсов.
      Я пришел к такому решению, когда делал управление котлом через OpenHab. Полагаю, в данном случае три секунды ничего не решает.

      Нравится

  1. Приветствую. Есть еще одна фича диммирования — установка яркости без включения, т.е. в openHab можно подключить asrto биндинг и устанавливать яркость по восходу/закату солнца и когда вы включите силовой блок кнопкой на стене, он будет светить с заданной яркостью. На сайте ноолайта не нашел этого, а вот в контроллере Wirenboard (сам его использую) это реализовано, называется shadow_level — работает.
    Может производитель поделится описанием доп. команд?

    Нравится

    1. Не думаю что производитель скрывает эту информацию — что в ней секретного?
      Не исключаю что Wirenboard реализует данную опцию путем периодической посылки пары команд: первую на включение с определённой яркостью а вторую на немедленное отключение. Это, конечно, лишь предположение.

      Нравится

Добавить комментарий для Igor Kandaurov Отменить ответ

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s