Драйвер для весоизмерительного преобразователя ТВ-005

Здравствуйте. Подключаю весы Тензо-М с преобразователем ТВ-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
Даже рекомендую сначала описать виртуальным устройством из правил - а потом уже реализовывать из вашего скрипта, чтобы не было различий.

есть пример запуска скрипта из правил и получения данных?

Не знаю на сколько мой опыт верный, но мне понадобилось подключить к 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, но есть моменты с кодировкой

1 Like

Да, ситуация очень похожая. Итоговые скрипты:

Запрос данных (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