1
0
mirror of https://github.com/thingsboard/thingsboard-gateway synced 2025-10-26 22:31:42 +08:00

Added RPC params processing for Modbus and removed orjson from packages #280 #279

This commit is contained in:
zbeacon
2020-04-07 09:54:45 +03:00
parent 2ddf770fa4
commit 9da60f3815
11 changed files with 70 additions and 60 deletions

View File

@@ -1,6 +1,6 @@
[metadata]
name = thingsboard-gateway
version = 2.2.4.1
version = 2.2.4.2
description = Thingsboard Gateway for IoT devices.
long_description= file: README.md
license = Apache Software License (Apache Software License 2.0)

View File

@@ -38,12 +38,11 @@ setup(
'pytz',
'PyYAML',
'simplejson',
'orjson>=2.6.3',
'pyrsistent',
'requests',
'python-can'
],
download_url='https://github.com/thingsboard/thingsboard-gateway/archive/2.2.4.1.tar.gz',
download_url='https://github.com/thingsboard/thingsboard-gateway/archive/2.2.4.2.tar.gz',
entry_points={
'console_scripts': [
'thingsboard-gateway = thingsboard_gateway.tb_gateway:daemon'

View File

@@ -1,6 +1,6 @@
%define name thingsboard-gateway
%define version 2.2.4.1
%define unmangled_version 2.2.4.1
%define version 2.2.4.2
%define unmangled_version 2.2.4.2
%define release 1
Summary: Thingsboard Gateway for IoT devices.

View File

@@ -55,11 +55,12 @@
"value": false
},
"setCPUFanSpeed": {
"type": "int",
"value": 42,
"functionCode": 16,
"address": 0,
"address": 1,
"byteOrder": "BIG",
"registerCount": 1
"registerCount": 2
},
"getCPULoad": {
"type": "int",

View File

@@ -40,11 +40,16 @@ class BytesModbusDownlinkConverter(ModbusConverter):
"16float": builder.add_16bit_float,
"32float": builder.add_32bit_float,
"64float": builder.add_64bit_float}
value = config["value"]
lower_type = config["tag"].lower()
value = None
if data.get("data") and data["data"].get("params") is not None:
value = data["data"]["params"]
else:
value = config["value"]
lower_type = config.get("type", config.get("tag", "error")).lower()
if lower_type == "error":
log.error('"type" and "tag" - not found in configuration.')
variable_size = config.get("registerCount", 1) * 8
if lower_type in ["integer", "dword", "dword/integer", "word"]:
if lower_type in ["integer", "dword", "dword/integer", "word", "int"]:
lower_type = str(variable_size) + "int"
assert builder_functions.get(lower_type) is not None
builder_functions[lower_type](value)
@@ -68,6 +73,8 @@ class BytesModbusDownlinkConverter(ModbusConverter):
log.debug(bits)
builder.add_bits(bits)
return builder.to_string()
else:
log.error("Unknown variable type")
builder_converting_functions = {5: builder.to_coils,
15: builder.to_coils,
@@ -77,6 +84,10 @@ class BytesModbusDownlinkConverter(ModbusConverter):
function_code = config["functionCode"]
if function_code in builder_converting_functions:
return builder_converting_functions[function_code]()
log.warning("Unsupported function code, for the device %s in the Modbus Downlink converter", self.__config["deviceName"])
builder = builder_converting_functions[function_code]()
if "Exception" in str(builder):
log.exception(builder)
builder = str(builder)
return builder
log.warning("Unsupported function code, for the device %s in the Modbus Downlink converter", config["device"])
return None

View File

@@ -231,44 +231,48 @@ class ModbusConnector(Connector, threading.Thread):
else:
log.error("Unknown Modbus function with code: %i", function_code)
log.debug("With result %s", str(result))
if "Exception" in str(result):
log.exception(result)
result = str(result)
return result
def server_side_rpc_handler(self, content):
log.debug("Modbus connector received rpc request for %s with content: %s", self.get_name(), content)
rpc_command_config = self.__devices[content["device"]]["config"]["rpc"].get(content["data"].get("method"))
if rpc_command_config is not None:
rpc_command_config["unitId"] = self.__devices[content["device"]]["config"]["unitId"]
if rpc_command_config.get('bit') is not None:
rpc_command_config["functionCode"] = 6
if rpc_command_config.get("functionCode") in (5, 6, 15, 16):
rpc_command_config["payload"] = self.__devices[content["device"]]["downlink_converter"].convert(rpc_command_config, content)
response = None
try:
response = self.__function_to_device(rpc_command_config, rpc_command_config["unitId"])
except Exception as e:
log.exception(e)
if isinstance(response, ReadRegistersResponseBase):
to_converter = {"rpc": {content["data"]["method"]: {"data_sent": rpc_command_config,
"input_data": response}}}
response = self.__devices[content["device"]]["converter"].convert(config=None, data=to_converter)
log.debug("Received RPC method: %s, result: %r", content["data"]["method"], response)
elif isinstance(response, (WriteMultipleRegistersResponse,
WriteMultipleCoilsResponse,
WriteSingleCoilResponse,
WriteSingleRegisterResponse)):
response = str(response)
log.debug("Write %r", response)
response = False if response is None else response
self.__gateway.send_rpc_reply(content["device"],
content["data"]["id"],
{content["data"]["method"]: response})
if content.get("device") is not None:
log.debug("Modbus connector received rpc request for %s with content: %s", content["device"], content)
rpc_command_config = self.__devices[content["device"]]["config"]["rpc"].get(content["data"].get("method"))
if rpc_command_config is not None:
rpc_command_config["unitId"] = self.__devices[content["device"]]["config"]["unitId"]
if rpc_command_config.get('bit') is not None:
rpc_command_config["functionCode"] = 6
if rpc_command_config.get("functionCode") in (5, 6, 15, 16):
rpc_command_config["payload"] = self.__devices[content["device"]]["downlink_converter"].convert(rpc_command_config, content)
response = None
try:
response = self.__function_to_device(rpc_command_config, rpc_command_config["unitId"])
except Exception as e:
log.exception(e)
if isinstance(response, ReadRegistersResponseBase):
to_converter = {"rpc": {content["data"]["method"]: {"data_sent": rpc_command_config,
"input_data": response}}}
response = self.__devices[content["device"]]["converter"].convert(config=None, data=to_converter)
log.debug("Received RPC method: %s, result: %r", content["data"]["method"], response)
elif isinstance(response, (WriteMultipleRegistersResponse,
WriteMultipleCoilsResponse,
WriteSingleCoilResponse,
WriteSingleRegisterResponse)):
response = str(response)
log.debug("Write %r", response)
response = False if response is None else response
response = str(response) if isinstance(response, Exception) else response
self.__gateway.send_rpc_reply(content["device"],
content["data"]["id"],
{content["data"]["method"]: response})
else:
log.error("Received rpc request, but method %s not found in config for %s.",
content["data"].get("method"),
self.get_name())
self.__gateway.send_rpc_reply(content["device"],
content["data"]["id"],
{content["data"]["method"]: "METHOD NOT FOUND!"})
else:
log.error("Received rpc request, but method %s not found in config for %s.",
content["data"].get("method"),
self.get_name())
self.__gateway.send_rpc_reply(content["device"],
content["data"]["id"],
{content["data"]["method"]: "METHOD NOT FOUND!"})
log.debug("Received RPC to connector: %r", content)

View File

@@ -24,8 +24,7 @@ from string import ascii_lowercase
from threading import Thread, RLock
from yaml import safe_load
from simplejson import load, dumps
from orjson import loads
from simplejson import load, dumps, loads
from thingsboard_gateway.gateway.tb_client import TBClient
from thingsboard_gateway.gateway.tb_logger import TBLoggerHandler

View File

@@ -16,8 +16,7 @@ from io import BufferedReader, FileIO
from os import remove
from os.path import exists
from base64 import b64decode
from simplejson import load, JSONDecodeError
from orjson import dumps
from simplejson import load, JSONDecodeError, dumps
from thingsboard_gateway.storage.file_event_storage import log
from thingsboard_gateway.storage.event_storage_files import EventStorageFiles
from thingsboard_gateway.storage.file_event_storage_settings import FileEventStorageSettings

View File

@@ -21,8 +21,7 @@ from threading import Thread
import paho.mqtt.client as paho
# from simplejson import dumps
from orjson import dumps
from simplejson import dumps
# from jsonschema import Draft7Validator
# from jsonschema import ValidationError

View File

@@ -14,8 +14,7 @@
import logging
import time
# from simplejson import dumps
from orjson import dumps
from simplejson import dumps
from thingsboard_gateway.tb_client.tb_device_mqtt import TBDeviceMqttClient
from thingsboard_gateway.tb_utility.tb_utility import TBUtility

View File

@@ -17,8 +17,7 @@ from os import path, listdir
from inspect import getmembers, isclass
from importlib import util
from logging import getLogger
# from simplejson import dumps, loads
from orjson import loads, dumps
from simplejson import dumps, loads
from jsonpath_rw import parse