Можно ли управлять устройством?

Если я верно понял задачу, то вам надо написать конвертер MQTT-топиков вашего устройства в нашу конвенцию, тогда оно появится в Devices.

Чуть подробнее про это можно почитать тут: Подключение сторонних устройств по MQTT — Wiren Board

Будут вопросы, спрашивайте, постараемся помочь.

2 лайка

Здравствуйте. У вас получилось решить свою задачу?

Добрый день. На данный момент реализовано создание виртуального устройства и подписка на топики, но пока не понимаю как добиться , например, звука переключения на моем реле Dingtian IOT Relay, как это реализовано для wb-mr6c 160, как на картинке выше.

Что значит «звук переключения»? Контроллер не издаёт никаких звуков же, когда переключает реле — это реле щёлкает.

Пришлите свой скрипт и покажите на примере, что не получается.

Ну в общем-то говоря есть следующий код для виртуального устройства:

defineVirtualDevice("myRelay", {
    title: "Dingtian IOT Relay 2Channel Relay Board",
    cells: {
        relay1: {
            type: "switch",
            value: false
        },
        relay2: {
            type: "switch",
            value: false
        }
    }
});

Устройство создано, все успешно:
image

Для него соответственно появился топик MQTT:
image

Также имеется возможность пощелкать реле физически (воткнул проводок в землю) , и, соответственно могу изменять значение реле, что отражается в топике MQTT оригинального девайса, а также того самого звука переключения (щелкание):
image

После того, как поработал проводом:
image

Теперь я взял виртуальный топик и попробовал сделать таким образом, чтобы если у меня на виртуальном стоит 0, тогда на мейн девайс посылать ON (ну и наоборот тоже):

import paho.mqtt.client as mqtt
import json



def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to broker: {}".format(broker))
        # client.subscribe("/test_relay/relay16584/out/#")
        client.subscribe("/devices/myRelay/controls/relay1")
    else:
        print('Not connected')


def on_message(client, userdata, msg):

    """BLOCK OF CODE THAT WILL PLACE THE VALUE TO THE TOPIC"""
    message1 = None  # define the message from the current topic

    data = {"idx": "1", "status": "OFF"}

    if '/devices/myRelay/controls/relay1' in msg.topic and 'meta' not in msg.topic:
        inter_topic = '/test_relay/relay16584/out/r1'
        inter_topic2 = '/test_relay/relay16584/out/relay1'

        # get the message of the relay_1 status (if we work with the Dingt relay, we should decode the value)
        if msg.payload.decode('utf-8') == '1':
            message1 = 'OFF'
            # print(msg.topic, msg.payload.decode('utf-8'))
        else:
            message1 = 'ON'
        print(message1)
        client.publish(inter_topic, payload=message1, qos=1, retain=True)
        client.publish(inter_topic2, payload=json.dumps(data), qos=1, retain=True)
    else:
        pass



client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker, port=port)

client.loop_forever()

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

Добрый день.
Итак, ваш скрипт пишет в топик /test_relay/relay16584/out/r1 и (зачем в два?) в топик /test_relay/relay16584/out/relay1 значения “ON” и “OFF”.

Вопрос: он действительно туда их пишет?

И самый главный - в какой топик устройства нужно писать новое значение, чтобы реле изменило состояние? Если туда опубликовать вручную новое значение - оно меняет состояние?

Всю эту логику можно реализовать без проблем на wb-rules, почему выбрали Python? Из него тоже можно, но на wb-rules куча почти готовых примеров.

Ну просто с Python больше практики было, вот и решил, что если есть возможность, то почему бы и нет

Добрый день. Касаемо написания в топики, не очень понимаю просто разницу того, в чем же состоит различие между r1 и relay1, так как в обоих из них меняется состояние, если я физически изменяю его (проводком щелкаю). Он их действительно туда записывает, но тут есть нюанс:
Если у меня стоит состояние на мейн девайсе OFF , а я подаю ON, то он их перепишет, но не надолго (буквально секунд 5 продержится значение ON)

Насчет последнего абзаца вашего предложения: тоже не очень очень очевидный момент. Дело в том, что если я напрямую связываюсь через MQTT с топиком /test_relay/relay16584/out/relay1 или другим /test_relay/relay16584/out/r1 и меняю в них значение (не важно в каждом из них по отдельности или в обоих вместе), то повторяется история , которую я выше в этом сообщении описал (згначения меняются, но не надолго).

Единственный пока рабочий вариант с тем, чтобы значения полностью менялись - ручное воздействие проводом на само реле.

Очень даже очевидно. Само устройство в эти топики пишет свое текущее состояние. Оно их даже не читает скорее всего. Просто обновляет регулярно.
Соответственно писать для изменения состояния - нужно, скорее всего, в другой топик.
Вот, для пример как сделано у нас: MQTT в контроллерах Wiren Board — Wiren Board
Обратите внимание - топик у нас в который записываем новое состояние - /on
И вот тут как раз обсуждалось.
похоже реле ждет json в топик.
А в документации производителя примеры есть?

Да, у меня есть китайское устройство на ESP, там топики:

xxx/state/relay1
xxx/state/relay2

содержат текущее стстояние
а

xxx/set/relay1
xxx/set/relay2

соответственно предназначены для управления

Если честно до этого момента не додумался прямо посмотреть сайт производителя. Сейчас начал мониторить их мануал.

P.S. а про последнее ваше сообщение не очень понял, так как у меня банально не было таких топиков. Более того изначально (когда только подключил реле) топики выглядели как обычные строки , а я просто добавил им топик meta (в данном случае речь идет про мейн девайс, а не виртуальный)

P.P.S. только что попробовал пощелкать через веб интерфейс самого реле, тоже все работает (со звуком)

А зачем?
То есть добавить-то можно, но смысл от меня ускользает.

Посмотрите в этот момент, что куда публикуется. Обычно, как говорил мой коллега, есть два типа топиков: state и command и вам надо понять, какой топик command, чтобы в него писать, а ещё в каком формате.

1 лайк

Здравствуйте.
Получилось ли у вас настроить управление реле, следуя советам коллег? Остались у ли вас вопросы по вашей проблеме?

В общем-то говоря значение изменяется и в подтопике /test_relay/relay16584/out/relay1 и в /test_relay/relay16584/out/r1 .
Касаемо же поставляемых данных , тут тоже вроде все верно , посмотрел в листе документации от производителя:

Пробую заменить через код:

    inter_topic2 = '/test_relay/relay16584/out/relay1'
    # message1 = 'ON'
    data = {"idx": "1", "status": "ON"}
    
    # client.publish(inter_topic, payload=message1, qos=1, retain=True)
    client.publish(inter_topic2, payload=json.dumps(data), qos=1, retain=True)
    print(msg.topic, msg.payload)
но все равно висит 30 секунд измененное состояние и потом перетирается. 

На просторах интернета нашел историю (https://community.openhab.org/t/dingtian-iot-relay-generic-mqtt-things/130598) , но меня смущает здесь то, что у человека уже заранее есть подтопики in и out, а в моем случае я вижу только out. Быть может, мне надо создать таким же способом подтопик in ?

P.S. представленный мною код выше, в котором закоментированы некоторые строки представлен только потому, что спросив у ChatGPT, что же является state и command получил ответ: 
Топик "/dingtian/relay100/out/r1" является state, а топик "/dingtian/relay100/out/relay1" является command.

Всем спасибо!
Вопрос решен. Просто создал подтопик in и отправляя в него статус следующим способом :{"type":"ON/OFF","idx":"1","status":"OFF","time":"0","pass":"0"} могу изменять состояние с щелчком реле.

Но правда остался последний вопрос: управлять данным реле я могу только с помощью виртуального устройства, правильно? То есть, мне нужно будет связывать виртуальное устройство с мейн девайсом, чтобы , например,в зависимости от состояние виртуального изменялось значение мейн устройства?

1 лайк

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

transformationPattern="JSONPATH:$.status", commandTopic="/dingtian/relay1916/in/control", on="{\"type\":\"ON/OFF\",\"idx\":\"1\",\"status\":\"ON\",\"time\":\"0\",\"pass\":\"0\"}", off="{\"type\":\"ON/OFF\",\"idx\":\"1\",\"status\":\"OFF\",\"time\":\"0\",\"pass\":\"0\"}"

Можно предположить что публиковать надо в /test_relay/relay16584/in/control значение {"type":"ON/OFF","idx":"1","status":"OFF","time":"0","pass":"0"}
Но это именно предположение.
Проще попробовать. Пример можно посмотреть Подключение термостата по zigbee - #5 от пользователя BrainRoot

PS: имено потому что мое китайское тоже было документировано “примерно никак” - я просто его перешил.

1 лайк

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

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.