Подскажите, пожалуйста, можно ли в правиле обрабатывать телеграммы, присылаемые по tcp-порту или по udp-порту?
Просто нужно от стороннего приложения получать команды и превращать их команды дл исполнительных устройств wiren-board. Как это лучше реализовать?
Каков вопрос, таков ответ.
Можно.
Хорошо. На данный момент вижу только следующую реализацию:
- в settings - config - Serial Device Driver Configuration создать serial tcp-port и слушать его.
Но:
- создать правило можно только на устройство, которое прописано в mqtt-devices, соответственно нужно создать устройство, то есть добавить devices, а devices можно выбрать из списка, в котором только modbus-устройства.
- Если добавить просто custom Modbus device и добавить ему channel, то можно в rules отслеживать состояние только этого канала, а его состояние отслеживается уже определенными получаемыми ответами на определенные команды запроса, которые он начинает слать автоматически.
Отсюда вопрос: Как сделать отслеживание не изменения состояния несуществующего modbus-устройства, а просто отслеживание приходящих строк и внутри правила сделать разбор строки, что пришла, при любом изменении на этом tcp-порту?
У вас чуть неверный подход. Если нужно просто слушать сокет - напишите сервис-слушатель, который будет (возможно предварительно разбирая) публиковать принятое в MQTT.
Реализовать “портом” в serial - вряд ли возможно.
А можете показать пример такого слушателя, пожалуйста? на JS, к сожалению, нет пока большого опыта.
На JS такое не написать. По крайней мере на используемой реализации.
А чем nc не устраивает?
while true; do nc -lu -p 8044; done
Ну и отправить с другого хоста:
echo -n "Kva-kva" | nc -u 10.0.0.75 8044
например. Добавьте парсинг вывода nc ну или просто публиуацию в MQTT через mosquitto_pub.
Даже программировать не надо, просто скриптинг.
Но по-хорошему то же самое пишется на C. Ну или на питоне.
Понял, через netcat можно попробовать. Но я правильно понимаю, что этот код надо вставлять в правило на wirenboard, чтобы код выполнялся?
Это не код. Это просто однострочник на баше.
В правило, используя вызов внешней программы - да, можно, в общем. Но тут, смотря каую архитектуру выберите. Если допишете в обнострочник публикацию принятого в MQTT - то однократно процесс можно и из скрипта правила запускать.
Да, думаю, что напишу разбор в скрипте на bash. (с этим конечно еще не сталкивался, но скрипты, обычно, это не страшно).
Как сделать тогда вызов скрипта из правила wirenboard?
И я правильно понимаю, что анализ приходящих телеграмм надо делать в скрипте и в зависимости от результатов парсинга строки просто дергать нужные мне MQTT устройства wirenboard-а?
Да, особо сложного нет.
Если хотите именно из wb-rules - то runShellCommand
Похожая тема:
Собственно говоря - неважно, как удобнее. Можно публиковать принятое в топик, можно разбирать и менять другие топики.
А можно тогда пример команды на смену топика из bash-скрипта?
подскажите пожалуйста, командой:
~# mosquitto_pub -t " /devices/wb-gpio/controls/EXT1_R3A4/on" -m “1”
не включается канал реле. Не ругается, что command not found, просто после выполнения ничего не происходит.
проверил /devices/wb-gpio/controls/EXT1_R3A4 - это устройство из списка MQTT-devices в контроллере. В чем может быть дело?
Проверьте топик… Для этого подпиштесь на
mosquitto_sub -v -t " /devices/wb-gpio/controls/#
и переключите из интерфейса.
Кака раз будет видно что пишется.
ничего не пишет.
Так и висит:
/devices/wb-gpio/controls/EXT1_R3A4 0
/devices/wb-gpio/controls/EXT1_R3A4 1
Вот, что пишет
В пропущенном подчерке?
попробовал все варианты:
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3A4/1” -m “1”
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3_A4/1” -m “1”
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3/A4/1” -m “1”
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3 A4/1” -m “1”
Все равно не реагирует на команды.
При подписке, при изменении состояния, присылает исправно:
/devices/wb-gpio/controls/EXT1_R3A4 0
/devices/wb-gpio/controls/EXT1_R3A4 1
нашел:
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3A4/on” -m “1” - включает
mosquitto_pub -t “/devices/wb-gpio/controls/EXT1_R3A4/on” -m “0” - выключает
А может ли быть так, что на linux на wirenboard нет netcat?
А то на все команды nc, например nc -u localhost 7777 ответ один - command not found