Виртуальное устройство Hikvision ISAPI

Здравствуйте!
Помогите пожалуйста с вопросом интеграции событий домофона Hikvision в контролер Wirenboard с помощью команд описанных в документации ISAPI Hikvision Video Intercom.
ISAPI - Video Intercom.pdf (716,8 КБ)

Можно ли это сделать с помощью виртуального устройства?
Задача такая: получить событие входящего звонка домофона и включить с помощью релейного модуля установленного в контроллер физический звонок в квартире.
Нашел похожий функционал в Home Assistant через аддон и трансляцию в MQTT но хотелось бы настроить прямое управление реле без прокладок стороннего софта.

Здравствуйте.

Работать с url запросами и json ответами можно из python.

Для работы с MQTT из Python есть библиотека paho-mqtt-python.

Есть какие-либо дополнительные вопросы?

ДА, больше чем ответов.
Спасибо)

А какие именно? давайте разберемся.

Добрый день!
Я надеялся на то что это возможно решить более упрощенными стандартными средствами ПО без углубленного программирования (не очень в этом понимаю) :slight_smile:

Действительно, нативных и конфигурируемых способов такой интеграции нет - нужно задействовать разработку.

Автор [аддона для HA] решил, что одними isapi rest запросами сделать не получится, и поэтому надо использовать sdk от hikvision (набор наТивных библиотек), и поэтому его интеграция требует аддон. Действительно, на внутренней станции (экранчике) нет веб-интерфейса, а якобы снять и положить “трубку” при звонке с домофона можно только с внутренней станции, то есть управлять ей можно только с sdk.

Но я планирую попробовать без аддона и чисто на wb. Правда, я не знаю, получится ли и сколько времени это займет

Но если найдете готовое решение, пишите пожалуйста

а открывать замок можно прям щас есичо

defineVirtualDevice('out_frontwicket_doorbell', {
    title: "Front Wicket Doorbell",
    cells: {
        open: {
            title: "Open Door",
            type: "pushbutton",
            value: false
        }
    }

});

defineRule({
    whenChanged: "out_frontwicket_doorbell/open",
    then: function () {
        runShellCommand("curl --digest -u " + user + ":" + password +
                " -X PUT -d '<RemoteControlDoor><cmd>open</cmd></RemoteControlDoor>' http://" +
                host + "/ISAPI/AccessControl/RemoteControl/door/1");

    }
});

3 лайка

О! Спасибо большое. Это уже половина того что мне нужно было)))
В правиле описывается создание виртуальной кнопки и функция - при изменении её value - выполнить runShellCommand("curl…
А мне необходимо создать виртуальное устройство и в первую очередь получить его value с помощью runShellCommand("curl…, а уже потом выполнить функцию активации реле дополнительного модуля контроллера.

пока не умею получать данные с домофона, все время возвращает какую-то ерунду (в том числе статус звонка у меня все время “idle”, даже если кто-то звонит). может, вообще не получится

вот так опрашивал раз в секунду, отчего у меня домофон уходил в кому, ломался веб-интерфейс и приходилось удалять куки, чтобы он ожил:

function checkStatusRecur() {
    runShellCommand('curl --digest -u ' + user + ':' + password + ' http://' + host + '/ISAPI/VideoIntercom/callStatus?format=json', {
        captureOutput: true,
        captureErrorOutput: true,
        exitCallback: function (exitCode, capturedOutput, capturedError) {
            if (exitCode === 0) {
                var input = JSON.parse(capturedOutput);
                dev['out_frontwicket_doorbell/status'] = input.CallStatus.status;
            } else {
                log.warning("Wicket check status error: " + capturedError);
            }
            lastRan = Date.now();
            setTimeout(function () {
                checkStatusRecur();
            }, 1000);
        }
    });
}

setInterval(function () {

    if (Date.now() - lastRan > 1000 * 60) {
        log.warning("Wicket check status ran too long ago, reinstating");
        //checkStatusRecur();
    }

}, 1000 * 60); // every minute

клалося сюда в виртуальное устройство:

    cells: {
        status: {
            title: "Call Status",
            type: "text",
            value: "onCall",
            readonly: true,
            enum: {
                idle: {en: 'Idle', ru: 'Ничего'},
                ring: {en: 'Ringing', ru: 'Звонок'},
                onCall: {en: 'Talking', ru: 'Разговор'}
            }
        },

короче непросто это. не работает так.