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] [metadata]
name = thingsboard-gateway name = thingsboard-gateway
version = 2.2.4.1 version = 2.2.4.2
description = Thingsboard Gateway for IoT devices. description = Thingsboard Gateway for IoT devices.
long_description= file: README.md long_description= file: README.md
license = Apache Software License (Apache Software License 2.0) license = Apache Software License (Apache Software License 2.0)

View File

@@ -38,12 +38,11 @@ setup(
'pytz', 'pytz',
'PyYAML', 'PyYAML',
'simplejson', 'simplejson',
'orjson>=2.6.3',
'pyrsistent', 'pyrsistent',
'requests', 'requests',
'python-can' '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={ entry_points={
'console_scripts': [ 'console_scripts': [
'thingsboard-gateway = thingsboard_gateway.tb_gateway:daemon' 'thingsboard-gateway = thingsboard_gateway.tb_gateway:daemon'

View File

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

View File

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

View File

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

View File

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

View File

@@ -24,8 +24,7 @@ from string import ascii_lowercase
from threading import Thread, RLock from threading import Thread, RLock
from yaml import safe_load from yaml import safe_load
from simplejson import load, dumps from simplejson import load, dumps, loads
from orjson import loads
from thingsboard_gateway.gateway.tb_client import TBClient from thingsboard_gateway.gateway.tb_client import TBClient
from thingsboard_gateway.gateway.tb_logger import TBLoggerHandler 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 import remove
from os.path import exists from os.path import exists
from base64 import b64decode from base64 import b64decode
from simplejson import load, JSONDecodeError from simplejson import load, JSONDecodeError, dumps
from orjson import dumps
from thingsboard_gateway.storage.file_event_storage import log from thingsboard_gateway.storage.file_event_storage import log
from thingsboard_gateway.storage.event_storage_files import EventStorageFiles from thingsboard_gateway.storage.event_storage_files import EventStorageFiles
from thingsboard_gateway.storage.file_event_storage_settings import FileEventStorageSettings 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 import paho.mqtt.client as paho
# from simplejson import dumps from simplejson import dumps
from orjson import dumps
# from jsonschema import Draft7Validator # from jsonschema import Draft7Validator
# from jsonschema import ValidationError # from jsonschema import ValidationError

View File

@@ -14,8 +14,7 @@
import logging import logging
import time import time
# from simplejson import dumps from simplejson import dumps
from orjson import dumps
from thingsboard_gateway.tb_client.tb_device_mqtt import TBDeviceMqttClient from thingsboard_gateway.tb_client.tb_device_mqtt import TBDeviceMqttClient
from thingsboard_gateway.tb_utility.tb_utility import TBUtility 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 inspect import getmembers, isclass
from importlib import util from importlib import util
from logging import getLogger from logging import getLogger
# from simplejson import dumps, loads from simplejson import dumps, loads
from orjson import loads, dumps
from jsonpath_rw import parse from jsonpath_rw import parse