Denn
December 25, 2024, 1:42pm
1
Здравствуйте. Подключаю весы Тензо-М с преобразователем ТВ-005. Подключение - WiFi, протокол TCP. Пример рабочего скрипта Python:
import socket
import time
conn=socket.socket()
data= (b'\xff\x01\xc3\xe3\xff\xff')
conn.connect(("172.16.3.73", 9750))
while True:
conn.send(data)
time.sleep(0.3)
temp=conn.recv(2048)
print (time.strftime('%X'),temp)
print ("___________________________________________________________")
time.sleep(2.0)
Как правильно теперь закинуть получаемые данные в MQTT?
Добрый день.
Структура, которую должен принять топик описана в GitHub - wirenboard/conventions: Wiren Board MQTT Conventions
Даже рекомендую сначала описать виртуальным устройством из правил - а потом уже реализовывать из вашего скрипта, чтобы не было различий.
Denn
December 26, 2024, 7:08am
3
есть пример запуска скрипта из правил и получения данных?
dvv_vrn
December 26, 2024, 3:05pm
4
Не знаю на сколько мой опыт верный, но мне понадобилось подключить к WB инвентор SILA. У него есть порт RS232 и простой текстовый протокол для обмена. Т.к. у меня WB и инвентор установлены в разных помещениях, то доступ к com порту организовал с помощью шлюза
Для получения данных отправляю команду, а потом разбираю ответ. Вроде ситуация как с вашими весами.
Добавил виртуальное устройство
и такой скрипт
defineRule("cronRS232", {
when: cron("*/10 * * * * *"),
then: function () {
spawn('bash', ['-c', "/root/nc_exec.sh"],{
captureOutput: true,
captureErrorOutput: true,
exitCallback: function (exitCode, capturedOutput, capturedErrorOutput)
{
if (exitCode != 0) {
log("sila_integration: cronRS232 Erroroutput: " + capturedErrorOutput);
}
else {
silaArray = capturedOutput.substring(1, 107).split(' ');
dev["mVD_SILA_Sensors/inputVoltage"] = Number(silaArray[0]);
dev["mVD_SILA_Sensors/power"] = Number(silaArray[4]);
dev["mVD_SILA_Sensors/temperature"] = Number(silaArray[11]);
}
}
})
}
});
в файле nc_exec.sh две строки
#!/bin/bash
/usr/bin/printf '\x51\x50\x49\x47\x53\xb7\xa9\x0d' | nc -w1 192.168.1.19 20108
По идее можно все сделать из модуля правил WB, но есть моменты с кодировкой
Здравствуйте.
Необходимо периодически отправлять команду на удаленный com порт. Если выполняю в консоли, то все работает
echo -e '\x51\x50\x49\x47\x53\xB7\xA9\x0D' | netcat -i1 -N 192.168.1.19 20108
Сервер корректно отвечает. Но когда в коде правил выполняется строка
runShellCommand("echo -e '\x51\x50\x49\x47\x53\xB7\xA9\x0D' | netcat -i1 -N 192.168.1.19 20108",{
captureOutput: true,
exitCallback: function (exitCode, capturedOutput)
{
log("response: " + capturedOutput);
…
1 Like
Denn
January 9, 2025, 9:04am
6
Да, ситуация очень похожая. Итоговые скрипты:
Запрос данных (Python):
import socket
import time
def main():
conn = socket.socket()
data = (b'\xff\x01\xc3\xe3\xff\xff')
conn.connect(("172.16.3.73", 9750))
conn.send(data)
time.sleep(0.2)
temp = conn.recv(2048)
print(list(temp))
if __name__ == "__main__":
main()
правило wb-rules:
defineRule("cronScales", {
when: cron("*/10 * * * * *"),
then: function () {
spawn('python', ["/mnt/data/root/scales_tcp1.py"],{
captureOutput: true,
captureErrorOutput: true,
exitCallback: function (exitCode, capturedOutput, capturedErrorOutput)
{
if (exitCode != 0) {
log("Scales Error output: " + capturedErrorOutput);
}
else {
dev["Scales/Брутто-вес груза"] = Number(capturedOutput.substring(28, 30) / 1000);
}
}
})
}
});
Спасибо за поддержку!
2 Likes