вторник, 22 января 2019 г.

Home Assistant: определяем количество дней от заданной даты

На Facebook наткнулся на интересный вопрос.



У человека закрытый бассейн, который требует регулярного обслуживания. Когда обслуживание произведено - текущая дата фиксируется в input_datetime.

Задача: добавить в систему датчик, который бы отображал количество дней, прошедшее с момента обслуживания. Чтобы можно было к этому датчику прикрутить уведомления, когда подойдет срок следующего обслуживания.

Не принципиально, но значения в input_datetime добавляются не вручную, а неким скриптом. Пользователю необходимо показать просто кнопку в интерфейсе, при клике на которую вызывается скрипт и в input_datetime проставляется текущая дата.

Насколько я понимаю, скрипт у человека уже был, поэтому постарался проработать остальные моменты.

Собственно, алгоритм работает для любых периодических работ: плановое ТО автомобиля, замена фильтров для воды и т.д.

1. Добавляем в систему input_datetime:

input_datetime:
  set_date:
    name: My date
    has_date: true
    has_time: false



2. Добавляем единственный сенсор:

sensor:
- platform: command_line
  name: Days Passed
  command: "echo $(( ($(date +%s) - $(date -d {{ states.input_datetime.set_date.state }} +%s)) / 86400 ))"
  value_template: '{{ value | multiply(1) | round(0) }}'



Основная задача решена.



Чтобы в Lovelace получить кнопку, при клике на которую выполняется скрипт - просто для нужного элемента указываем tap_action:

- type: entity-button
  entity: script.message_temperature
    tap_action:
      action: call-service
      service: script.turn_on
      service_data:
        entity_id: script.message_temperature



Или немного короче (для скриптов работают оба варианта):

- type: entity-button
  entity: script.message_temperature
    tap_action:
      action: call-service
      service: script.message_temperature

Весь процесс на видео:

вторник, 30 января 2018 г.

Программно включаем/отключаем события (events)

Как активировать/деактивировать событие (event)?

1. Получаем список имеющихся событий.
http://[Domoticz IP]:8088/json.htm?type=events&param=list

2. В полученном JSON находим нужное событие и запоминаем его id

3. Выполняем запрос:
http://[Domoticz IP]:8088/json.htm?type=events&param=updatestatus&eventid=21&eventstatus=0
http://[Domoticz IP]:8088/json.htm?type=events&param=updatestatus&eventid=21&eventstatus=1
для деактивации и активации соответственно.


Источник информации:
https://github.com/ultratoto14/domoticz/blob/324f0f274bdba92b70a07faf24980c854df83183/main/EventSystem.cpp

Если датчик давно не обновлялся

commandArray = {}
if otherdevices['test2']~=otherdevices['test1'] then
    if uservariables['status1']==1 then
        otherdevices_lastupdate['test1'] = os.date("%Y-%m-%d %H:%M:%S")
        commandArray['Variable:status1'] = tostring(0)    
    else
        t2 = os.time()
        s = otherdevices_lastupdate['test1']
        year = string.sub(s, 14)
        month = string.sub(s, 67)
        day = string.sub(s, 910)
        hour = string.sub(s, 1213)
        minutes = string.sub(s, 1516)
        seconds = string.sub(s, 1819)
        t1 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
        difference = (os.difftime (t2, t1))
        if difference>15 then
            commandArray['test1'] = otherdevices['test2']
            commandArray['Variable:status1'] = tostring(1)
        end
    end
end
return commandArray