mirror of
https://github.com/thingsboard/thingsboard-gateway
synced 2025-10-26 22:31:42 +08:00
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
3
setup.py
3
setup.py
@@ -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'
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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!"})
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user