boneIO 0.8.0.dev2__tar.gz → 0.8.0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/PKG-INFO +1 -1
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/bonecli.py +34 -3
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/const.py +1 -2
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/cwt.json +4 -1
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/modbuscli.py +32 -12
- boneIO-0.8.0.dev5/boneio/modbus/r4dcb08.json +91 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/oled.py +18 -6
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/schema.yaml +1 -0
- boneIO-0.8.0.dev5/boneio/version.py +2 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/pyproject.toml +1 -1
- boneIO-0.8.0.dev2/boneio/modbus/r4dcb08.json +0 -76
- boneIO-0.8.0.dev2/boneio/version.py +0 -2
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/LICENSE +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/README.md +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/cover.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/adc.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/binary_sensor.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/config.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/cover.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/event.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/event_all.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/led32x4A.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/output24x16A.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/output24x16A_v0.3.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/example_config/output32x5A.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/fonts/danube__.ttf +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/group/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/group/output.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/async_updater.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/click_timer.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/config.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/events.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/exceptions.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/filter.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/gpio.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/ha_discovery.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/loader.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/logger.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/mqtt.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/oled.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/onewire/W1ThermSensor.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/onewire/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/onewire/ds2482.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/onewire/onewire.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/pcf8575.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/queue.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/sensor/ina_219_smbus.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/state_manager.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/stats.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/timeperiod.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/util.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/helper/yaml_util.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/input/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/input/gpio.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/input/gpio_new.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/manager.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/client.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/dts1964_3f.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/orno-or-we-517.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/pt100.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/sdm120.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/sdm630.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/sensor.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/socomec_e23.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/sofar.json +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/modbus/utils.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/mqtt_client.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/basic.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/gpio.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/mcp.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/pca.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/relay/pcf.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/runner.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/actions.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/actions_sensor.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/actions_switch.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/filters.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/filters_adc.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/id.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/temp_unit.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/schema/update_interval.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/adc.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/gpio.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/gpio_new.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/ina219.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/temp/__init__.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/temp/dallas.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/temp/lm75.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/boneio/sensor/temp/mcp9808.py +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/tests/32_5_config.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/tests/bandit.yaml +0 -0
- {boneIO-0.8.0.dev2 → boneIO-0.8.0.dev5}/tests/relay_32_5.py +0 -0
|
@@ -110,6 +110,31 @@ def get_arguments() -> argparse.Namespace:
|
|
|
110
110
|
help="Current baudrate",
|
|
111
111
|
)
|
|
112
112
|
|
|
113
|
+
modbus_parser.add_argument(
|
|
114
|
+
"--bytesize",
|
|
115
|
+
type=int,
|
|
116
|
+
required=False,
|
|
117
|
+
default=8,
|
|
118
|
+
help="Bytesize",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
modbus_parser.add_argument(
|
|
122
|
+
"--stopbits",
|
|
123
|
+
type=int,
|
|
124
|
+
required=False,
|
|
125
|
+
default=1,
|
|
126
|
+
help="stopbits",
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
modbus_parser.add_argument(
|
|
130
|
+
"--parity",
|
|
131
|
+
type=str,
|
|
132
|
+
choices=["P", "E", "N"],
|
|
133
|
+
default="N",
|
|
134
|
+
required=False,
|
|
135
|
+
help="Parity",
|
|
136
|
+
)
|
|
137
|
+
|
|
113
138
|
modbus_sub_parser = modbus_parser.add_subparsers(
|
|
114
139
|
dest="modbus_action", required=True
|
|
115
140
|
)
|
|
@@ -117,7 +142,7 @@ def get_arguments() -> argparse.Namespace:
|
|
|
117
142
|
set_modbus_parser.add_argument(
|
|
118
143
|
"--device",
|
|
119
144
|
type=str,
|
|
120
|
-
choices=["cwt"],
|
|
145
|
+
choices=["cwt", "r4dcb08"],
|
|
121
146
|
help="Choose device to set modbus address/baudrate",
|
|
122
147
|
required=True,
|
|
123
148
|
)
|
|
@@ -131,8 +156,8 @@ def get_arguments() -> argparse.Namespace:
|
|
|
131
156
|
set_modbus_parser_group.add_argument(
|
|
132
157
|
"--new-baudrate",
|
|
133
158
|
type=int,
|
|
134
|
-
choices=[2400, 4800, 9600, 19200],
|
|
135
|
-
help="Choose new baudrate to set",
|
|
159
|
+
choices=[1200, 2400, 4800, 9600, 19200],
|
|
160
|
+
help="Choose new baudrate to set. CWT doesn't work on 1200.",
|
|
136
161
|
)
|
|
137
162
|
|
|
138
163
|
get_modbus_parser = modbus_sub_parser.add_parser("get")
|
|
@@ -205,6 +230,9 @@ def run_modbus_command(
|
|
|
205
230
|
uart=args.uart,
|
|
206
231
|
address=args.address,
|
|
207
232
|
baudrate=args.baudrate,
|
|
233
|
+
parity=args.parity,
|
|
234
|
+
bytesize=args.bytesize,
|
|
235
|
+
stopbits=args.stopbits,
|
|
208
236
|
new_baudrate=args.new_baudrate,
|
|
209
237
|
new_address=args.new_address,
|
|
210
238
|
),
|
|
@@ -217,6 +245,9 @@ def run_modbus_command(
|
|
|
217
245
|
baudrate=args.baudrate,
|
|
218
246
|
register_address=args.register_address,
|
|
219
247
|
register_type=args.register_type,
|
|
248
|
+
parity=args.parity,
|
|
249
|
+
bytesize=args.bytesize,
|
|
250
|
+
stopbits=args.stopbits,
|
|
220
251
|
value_type=args.value_type,
|
|
221
252
|
),
|
|
222
253
|
)
|
|
@@ -9,7 +9,7 @@ from .utils import REGISTERS_BASE, allowed_operations
|
|
|
9
9
|
_LOGGER = logging.getLogger(__name__)
|
|
10
10
|
SET_BASE = "set_base"
|
|
11
11
|
SET_ADDRESS = "set_address_address"
|
|
12
|
-
SET_BAUDRATE = "
|
|
12
|
+
SET_BAUDRATE = "set_baudrate"
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class ModbusHelper:
|
|
@@ -26,14 +26,17 @@ class ModbusHelper:
|
|
|
26
26
|
model: dict,
|
|
27
27
|
check_record: dict,
|
|
28
28
|
check_record_method: str,
|
|
29
|
+
stopbits: int = 1,
|
|
30
|
+
bytesize: int = 8,
|
|
31
|
+
parity: str = "N",
|
|
29
32
|
) -> None:
|
|
30
33
|
"""Initialize Modbus Helper."""
|
|
31
34
|
self._modbus = Modbus(
|
|
32
35
|
uart=UARTS[uart],
|
|
33
36
|
baudrate=baudrate,
|
|
34
|
-
stopbits=
|
|
35
|
-
bytesize=
|
|
36
|
-
parity=
|
|
37
|
+
stopbits=stopbits,
|
|
38
|
+
bytesize=bytesize,
|
|
39
|
+
parity=parity,
|
|
37
40
|
)
|
|
38
41
|
self._model = model
|
|
39
42
|
self._device = device
|
|
@@ -73,20 +76,23 @@ class ModbusHelper:
|
|
|
73
76
|
return False
|
|
74
77
|
return True
|
|
75
78
|
|
|
76
|
-
def set_connection_speed(self, new_baudrate: int):
|
|
77
|
-
|
|
79
|
+
def set_connection_speed(self, new_baudrate: int) -> int:
|
|
80
|
+
baudrate_model = self._model[SET_BAUDRATE]
|
|
81
|
+
ind = baudrate_model["possible_baudrates"].index(new_baudrate)
|
|
78
82
|
if ind:
|
|
79
83
|
result = self._modbus.client.write_register(
|
|
80
|
-
address=
|
|
84
|
+
address=baudrate_model["address"],
|
|
81
85
|
value=ind,
|
|
82
86
|
unit=self._device_address,
|
|
83
87
|
)
|
|
84
88
|
if result.isError():
|
|
85
89
|
_LOGGER.error("Operation failed.")
|
|
90
|
+
return 1
|
|
86
91
|
else:
|
|
87
92
|
_LOGGER.info(
|
|
88
93
|
"Operation succeeded. Now restart device by disconnecting it."
|
|
89
94
|
)
|
|
95
|
+
return 0
|
|
90
96
|
|
|
91
97
|
def set_new_address(self, new_address: int):
|
|
92
98
|
if 0 < new_address < 253:
|
|
@@ -112,6 +118,9 @@ async def async_run_modbus_set(
|
|
|
112
118
|
baudrate: int,
|
|
113
119
|
new_baudrate: int,
|
|
114
120
|
new_address: int,
|
|
121
|
+
stopbits: int = 1,
|
|
122
|
+
bytesize: int = 8,
|
|
123
|
+
parity: str = "N",
|
|
115
124
|
):
|
|
116
125
|
"""Run Modbus Set Function."""
|
|
117
126
|
if new_address and new_baudrate:
|
|
@@ -122,6 +131,9 @@ async def async_run_modbus_set(
|
|
|
122
131
|
if not first_reg_base:
|
|
123
132
|
return False
|
|
124
133
|
first_record = first_reg_base.get(REGISTERS, [])[0]
|
|
134
|
+
_LOGGER.debug(
|
|
135
|
+
f"Connecting with params uart: {uart}, baudrate: {baudrate}, stopbits: {stopbits}, bytesize: {bytesize}, parity: {parity}."
|
|
136
|
+
)
|
|
125
137
|
modbus_helper = ModbusHelper(
|
|
126
138
|
device=device,
|
|
127
139
|
uart=uart,
|
|
@@ -130,13 +142,15 @@ async def async_run_modbus_set(
|
|
|
130
142
|
model=set_base,
|
|
131
143
|
check_record=first_record,
|
|
132
144
|
check_record_method=first_reg_base.get("register_type", "input"),
|
|
145
|
+
stopbits=stopbits,
|
|
146
|
+
bytesize=bytesize,
|
|
147
|
+
parity=parity,
|
|
133
148
|
)
|
|
134
149
|
if not await modbus_helper.check_connection():
|
|
135
150
|
_LOGGER.error("Can't connect with sensor. Exiting")
|
|
136
151
|
return 1
|
|
137
152
|
if new_baudrate:
|
|
138
|
-
modbus_helper.set_connection_speed(new_baudrate=new_baudrate)
|
|
139
|
-
return 0
|
|
153
|
+
return modbus_helper.set_connection_speed(new_baudrate=new_baudrate)
|
|
140
154
|
if new_address:
|
|
141
155
|
modbus_helper.set_new_address(new_address=new_address)
|
|
142
156
|
return 0
|
|
@@ -150,14 +164,20 @@ async def async_run_modbus_get(
|
|
|
150
164
|
register_type: str,
|
|
151
165
|
baudrate: int,
|
|
152
166
|
value_type: str,
|
|
167
|
+
stopbits: int = 1,
|
|
168
|
+
bytesize: int = 8,
|
|
169
|
+
parity: str = "N",
|
|
153
170
|
):
|
|
154
171
|
"""Run Modbus Get Function."""
|
|
172
|
+
_LOGGER.debug(
|
|
173
|
+
f"Connecting with params uart: {uart}, baudrate: {baudrate}, stopbits: {stopbits}, bytesize: {bytesize}, parity: {parity}."
|
|
174
|
+
)
|
|
155
175
|
_modbus = Modbus(
|
|
156
176
|
uart=UARTS[uart],
|
|
157
177
|
baudrate=baudrate,
|
|
158
|
-
stopbits=
|
|
159
|
-
bytesize=
|
|
160
|
-
parity=
|
|
178
|
+
stopbits=stopbits,
|
|
179
|
+
bytesize=bytesize,
|
|
180
|
+
parity=parity,
|
|
161
181
|
)
|
|
162
182
|
count = 1 if value_type == "S_WORD" or value_type == "U_WORD" else 2
|
|
163
183
|
value = await _modbus.read_multiple_registers(
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"model": "R4DCB08",
|
|
3
|
+
"set_base": {
|
|
4
|
+
"set_address_address": 254,
|
|
5
|
+
"set_baudrate": {
|
|
6
|
+
"address": 255,
|
|
7
|
+
"possible_baudrates": [1200, 2400, 4800, 9600, 19200]
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"registers_base": [
|
|
11
|
+
{
|
|
12
|
+
"base": 0,
|
|
13
|
+
"length": 16,
|
|
14
|
+
"register_type": "holding",
|
|
15
|
+
"registers": [
|
|
16
|
+
{
|
|
17
|
+
"name": "Temperature 1",
|
|
18
|
+
"address": 0,
|
|
19
|
+
"unit_of_measurement": "°C",
|
|
20
|
+
"state_class": "measurement",
|
|
21
|
+
"device_class": "temperature",
|
|
22
|
+
"value_type": "S_WORD",
|
|
23
|
+
"filters": [{ "multiply": 0.1 }]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "Temperature 2",
|
|
27
|
+
"address": 1,
|
|
28
|
+
"unit_of_measurement": "°C",
|
|
29
|
+
"state_class": "measurement",
|
|
30
|
+
"device_class": "temperature",
|
|
31
|
+
"value_type": "S_WORD",
|
|
32
|
+
"filters": [{ "multiply": 0.1 }]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "Temperature 3",
|
|
36
|
+
"address": 2,
|
|
37
|
+
"unit_of_measurement": "°C",
|
|
38
|
+
"state_class": "measurement",
|
|
39
|
+
"device_class": "temperature",
|
|
40
|
+
"value_type": "S_WORD",
|
|
41
|
+
"filters": [{ "multiply": 0.1 }]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "Temperature 4",
|
|
45
|
+
"address": 3,
|
|
46
|
+
"unit_of_measurement": "°C",
|
|
47
|
+
"state_class": "measurement",
|
|
48
|
+
"device_class": "temperature",
|
|
49
|
+
"value_type": "S_WORD",
|
|
50
|
+
"filters": [{ "multiply": 0.1 }]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "Temperature 5",
|
|
54
|
+
"address": 4,
|
|
55
|
+
"unit_of_measurement": "°C",
|
|
56
|
+
"state_class": "measurement",
|
|
57
|
+
"device_class": "temperature",
|
|
58
|
+
"value_type": "S_WORD",
|
|
59
|
+
"filters": [{ "multiply": 0.1 }]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "Temperature 6",
|
|
63
|
+
"address": 5,
|
|
64
|
+
"unit_of_measurement": "°C",
|
|
65
|
+
"state_class": "measurement",
|
|
66
|
+
"device_class": "temperature",
|
|
67
|
+
"value_type": "S_WORD",
|
|
68
|
+
"filters": [{ "multiply": 0.1 }]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "Temperature 7",
|
|
72
|
+
"address": 6,
|
|
73
|
+
"unit_of_measurement": "°C",
|
|
74
|
+
"state_class": "measurement",
|
|
75
|
+
"device_class": "temperature",
|
|
76
|
+
"value_type": "S_WORD",
|
|
77
|
+
"filters": [{ "multiply": 0.1 }]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "Temperature 8",
|
|
81
|
+
"address": 7,
|
|
82
|
+
"unit_of_measurement": "°C",
|
|
83
|
+
"state_class": "measurement",
|
|
84
|
+
"device_class": "temperature",
|
|
85
|
+
"value_type": "S_WORD",
|
|
86
|
+
"filters": [{ "multiply": 0.1 }]
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
@@ -26,8 +26,7 @@ fonts = {
|
|
|
26
26
|
"big": make_font("DejaVuSans.ttf", 12),
|
|
27
27
|
"small": make_font("DejaVuSans.ttf", 9),
|
|
28
28
|
"extraSmall": make_font("DejaVuSans.ttf", 7),
|
|
29
|
-
"danube": make_font("danube__.ttf", 15, local=True)
|
|
30
|
-
|
|
29
|
+
"danube": make_font("danube__.ttf", 15, local=True),
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
# screen_order = [UPTIME, NETWORK, CPU, DISK, MEMORY, SWAP]
|
|
@@ -96,7 +95,9 @@ class Oled:
|
|
|
96
95
|
|
|
97
96
|
def _sleeptime(self):
|
|
98
97
|
with canvas(self._device) as draw:
|
|
99
|
-
draw.rectangle(
|
|
98
|
+
draw.rectangle(
|
|
99
|
+
self._device.bounding_box, outline="black", fill="black"
|
|
100
|
+
)
|
|
100
101
|
self._sleep = True
|
|
101
102
|
|
|
102
103
|
def _draw_uptime(self, data: dict, draw: ImageDraw) -> None:
|
|
@@ -116,7 +117,12 @@ class Oled:
|
|
|
116
117
|
def _draw_output(self, data: dict, draw: ImageDraw) -> None:
|
|
117
118
|
"Draw outputs of GPIO/MCP relays."
|
|
118
119
|
cols = cycle(OUTPUT_COLS)
|
|
119
|
-
draw.text(
|
|
120
|
+
draw.text(
|
|
121
|
+
(1, 1),
|
|
122
|
+
f"Relay {self._current_screen}",
|
|
123
|
+
font=fonts["small"],
|
|
124
|
+
fill=WHITE,
|
|
125
|
+
)
|
|
120
126
|
i = 0
|
|
121
127
|
j = next(cols)
|
|
122
128
|
for k in data:
|
|
@@ -124,7 +130,10 @@ class Oled:
|
|
|
124
130
|
j = next(cols)
|
|
125
131
|
i = 0
|
|
126
132
|
draw.text(
|
|
127
|
-
(j, OUTPUT_ROWS[i]),
|
|
133
|
+
(j, OUTPUT_ROWS[i]),
|
|
134
|
+
f"{shorten_name(k)} {data[k]}",
|
|
135
|
+
font=fonts["extraSmall"],
|
|
136
|
+
fill=WHITE,
|
|
128
137
|
)
|
|
129
138
|
i += 1
|
|
130
139
|
|
|
@@ -133,7 +142,10 @@ class Oled:
|
|
|
133
142
|
data = self._host_data.get(self._current_screen)
|
|
134
143
|
if data:
|
|
135
144
|
with canvas(self._device) as draw:
|
|
136
|
-
if
|
|
145
|
+
if (
|
|
146
|
+
self._output_groups
|
|
147
|
+
and self._current_screen in self._output_groups
|
|
148
|
+
):
|
|
137
149
|
self._draw_output(data, draw)
|
|
138
150
|
elif self._current_screen == UPTIME:
|
|
139
151
|
self._draw_uptime(data, draw)
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"model": "R4DCB08",
|
|
3
|
-
"registers_base": [
|
|
4
|
-
{
|
|
5
|
-
"base": 0,
|
|
6
|
-
"length": 16,
|
|
7
|
-
"register_type": "holding",
|
|
8
|
-
"registers": [
|
|
9
|
-
{
|
|
10
|
-
"name": "Temperature 1",
|
|
11
|
-
"address": 0,
|
|
12
|
-
"unit_of_measurement": "°C",
|
|
13
|
-
"state_class": "measurement",
|
|
14
|
-
"device_class": "temperature",
|
|
15
|
-
"return_type": "multiply0_1"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"name": "Temperature 2",
|
|
19
|
-
"address": 1,
|
|
20
|
-
"unit_of_measurement": "°C",
|
|
21
|
-
"state_class": "measurement",
|
|
22
|
-
"device_class": "temperature",
|
|
23
|
-
"return_type": "multiply0_1"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"name": "Temperature 3",
|
|
27
|
-
"address": 2,
|
|
28
|
-
"unit_of_measurement": "°C",
|
|
29
|
-
"state_class": "measurement",
|
|
30
|
-
"device_class": "temperature",
|
|
31
|
-
"return_type": "multiply0_1"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"name": "Temperature 4",
|
|
35
|
-
"address": 3,
|
|
36
|
-
"unit_of_measurement": "°C",
|
|
37
|
-
"state_class": "measurement",
|
|
38
|
-
"device_class": "temperature",
|
|
39
|
-
"return_type": "multiply0_1"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"name": "Temperature 5",
|
|
43
|
-
"address": 4,
|
|
44
|
-
"unit_of_measurement": "°C",
|
|
45
|
-
"state_class": "measurement",
|
|
46
|
-
"device_class": "temperature",
|
|
47
|
-
"return_type": "multiply0_1"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"name": "Temperature 6",
|
|
51
|
-
"address": 5,
|
|
52
|
-
"unit_of_measurement": "°C",
|
|
53
|
-
"state_class": "measurement",
|
|
54
|
-
"device_class": "temperature",
|
|
55
|
-
"return_type": "multiply0_1"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"name": "Temperature 7",
|
|
59
|
-
"address": 6,
|
|
60
|
-
"unit_of_measurement": "°C",
|
|
61
|
-
"state_class": "measurement",
|
|
62
|
-
"device_class": "temperature",
|
|
63
|
-
"return_type": "multiply0_1"
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"name": "Temperature 8",
|
|
67
|
-
"address": 7,
|
|
68
|
-
"unit_of_measurement": "°C",
|
|
69
|
-
"state_class": "measurement",
|
|
70
|
-
"device_class": "temperature",
|
|
71
|
-
"return_type": "multiply0_1"
|
|
72
|
-
}
|
|
73
|
-
]
|
|
74
|
-
}
|
|
75
|
-
]
|
|
76
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|