
2 . . - .
.
Arduino UNO. UART . .. , . . — . Ethernet- . - dsl- D-link DSL-2500U . , , ,
ADSL- Ethernet- Arduino/CraftDuino.
- «» UART. / , .
. Modbus
RF24Network. OpenHAB.
. NRF24L01+, . - , :
Borich, !
Modbus. OpenHAB — , . .
ethernet-shield . — , , .
.ModbusRtu over TCP . modpoll,
Arduino & Modbus . — 192.168.1.110 3000 !
OpenHAB. , , Modbus Binding «RTU over TCP». — ModbusRtu c TCP. OpenHAB-(ethernet)--(UART)-.
, ? Item . 1 Item . — . , , TCP Modbus Binding. .. .
Modbus Binding Item' host-port-slaveID .
, . . , .
, , . NRF24L01+!.. — , — . . ID , . . — Modbus.
Modbus — .
RF24Network — , .
Arduino
Modbus-Master-Slave-for-Arduino .
( library.properties, ) Arduino IDE 1.6.5.
Modbus-over-RF24Network-for-Arduino — Proxy Slave. ModbusRF24Proxy «» , .
ModbusRF24Proxy#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <ModbusRtu.h>
#include <ModbusRtuRF24.h>
#define stlPin 13
RF24 radio(9, 10);
RF24Network network(radio);
const uint16_t this_node = 0;
ModbusRF24 proxy(network, 0, 0);
int8_t state = 0;
unsigned long tempus;
void setup() {
io_setup();
proxy.begin(57600);
SPI.begin();
radio.begin();
network.begin( 90, this_node);
tempus = millis() + 100;
digitalWrite(stlPin, HIGH);
}
void io_setup() {
digitalWrite(stlPin, HIGH);
pinMode(stlPin, OUTPUT);
}
void loop() {
network.update();
state = proxy.proxy();
if (state > 4) {
tempus = millis() + 50;
digitalWrite(stlPin, HIGH);
}
if (millis() > tempus) digitalWrite(stlPin, LOW);
}
, :
ModbusRF24 proxy(network, 0, 0);
proxy.proxy();
, RF24Network, , .
RF24Network- :
const uint16_t this_node = 0;
— .. . , - .
ModbusRF24SlaveArduino & Modbus:
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <ModbusRtu.h>
#include <ModbusRtuRF24.h>
#define ID 1
#define btnPin 2
#define ledPin 7
RF24 radio(9, 10);
RF24Network network(radio);
const uint16_t this_node = ID;
ModbusRF24 slave(network, ID);
uint16_t au16data[11];
void io_setup() {
digitalWrite(ledPin, LOW);
pinMode(ledPin, OUTPUT);
pinMode(btnPin, INPUT);
}
void io_poll() {
au16data[0] = au16data[1];
digitalWrite(ledPin, bitRead(au16data[1], 3));
bitWrite(au16data[0], 3, digitalRead(btnPin));
au16data[2] = au16data[5];
au16data[3] = au16data[6];
au16data[4] = au16data[7];
au16data[8] = slave.getInCnt();
au16data[9] = slave.getOutCnt();
au16data[10] = slave.getErrCnt();
}
void setup() {
io_setup();
Serial.begin(57600);
Serial.println("RF24Network/examples/modbus_slave/");
SPI.begin();
radio.begin();
network.begin( 90, this_node);
}
void loop() {
network.update();
if (network.available()) {
slave.poll(au16data, 11);
}
io_poll();
}
:
ModbusRF24 slave(network, ID);
Modbus
. OpenHAB , .
:
- , (O2, , );
- (, , , , );
- . ;
- (, 0°, 15°, 30°, 45°, 60°);
- (, "| |", "/ /", "/ |", "| \", "\ \" );
- (, );
- ;
- ;
- (, );
- (, );
. .
ModbusType | Byte | Bit | Name | |
---|
Bit RO | 0 | 0 | CFG_OXYGEN | 1 — |
Bit RO | | 1 | CFG_ION | 1 — |
Bit RO | | 2 | CFG_QUIET | 1 — |
Bit RO | | 3 | CFG_TIMER | 1 — / |
Bit RO | | 4 | CFG_DELAY | 1 — / |
Bit RO | | 5 | CFG_SWING | 1 — |
Bit RO | | 6 | CFG_SWINGH | 1 — |
Bit RO | | 7 | CFG_SWINGV | 1 — |
Bit RO | | 8 | CFG_CLOCK | 1 — |
Bit RO | | 9 | | |
Bit RO | | 10 | | |
Bit RO | | 11 | CFG_AUTO | 1 — AUTO |
Bit RO | | 12 | CFG_COOL | 1 — COOL |
Bit RO | | 13 | CFG_HEAT | 1 — HEAT |
Bit RO | | 14 | CFG_DRY | 1 — DRY |
Bit RO | | 15 | CFG_FAN | 1 — FAN |
Integer RO | 1 | | CFG_TEMP | . . : Min + Max*256 |
Integer RO | 2 | | CFG_FAN_SPEED | FAN |
Bit RO | 3 | 0 | STATE_POWER | :0 — , 1 — |
Bit RO | | 1 | STATE_OXYGEN | :0 — , 1 — |
Bit RO | | 2 | STATE_ION | :0 — , 1 — |
Bit RO | | 3 | STATE_QUIET | :0 — , 1 — |
Bit RO | | 4 | STATE_TIMER | :0 — , 1 — |
| | | | |
Bit RW | | 8 | CONTROL_POWER | |
Bit RW | | 9 | CONTROL_OXYGEN | |
Bit RW | | 10 | CONTROL_ION | |
Bit RW | | 11 | CONTROL_QUIET | |
Integer RO | 4 | | RTC_HR_MI | 0x1308 |
Integer RW | 5 | | RTCW_HR_MI | 0x1308 |
Integer RO | 6 | | TEMPERATURE1 | . INT16, |
Integer RO | 7 | | TEMPERATURE2 | . INT16, |
Bit RW | 8 | 0 | MODE_AUTO | |
Bit RW | | 1 | MODE_COOL | |
Bit RW | | 2 | MODE_HEAT | |
Bit RW | | 3 | MODE_DRY | |
Bit RW | | 4 | MODE_FAN | |
Integer RW | 9 | | TEMP_AUTO | AUTO |
Integer RW | 10 | | TEMP_COOL | COOL |
Integer RW | 11 | | TEMP_HEAT | HEAT |
Integer RW | 12 | | TEMP_DRY | DRY |
Integer RW | 13 | | FAN_AUTO | AUTO. 0: Auto |
Integer RW | 14 | | FAN_COOL | COOL. 0: Auto |
Integer RW | 15 | | FAN_HEAT | HEAT. 0: Auto |
Integer RW | 16 | | FAN_DRY | DRY. 0: Auto |
Integer RW | 17 | | FAN_SPEED | FAN. 0: Auto |
Bit RW | 18 | 0 | SWING_AUTO | |
Bit RW | | 1 | SWINGV_0 | 0° |
Bit RW | | 2 | SWINGV_15 | 15° |
Bit RW | | 3 | SWINGV_30 | 30° |
Bit RW | | 4 | SWINGV_45 | 45° |
Bit RW | | 5 | SWINGV_60 | 60° |
Bit RW | 19 | 0 | SWINGH_AUTO | |
Bit RW | | 1 | SWINGH_VV | | | |
Bit RW | | 2 | SWINGH_LL | / / |
Bit RW | | 3 | SWINGH_LV | / | |
Bit RW | | 4 | SWINGH_VR | | \ |
Bit RW | | 5 | SWINGH_RR | \ \ |
Bit RW | 20 | 0 | TIMER_ON | |
Bit RW | | 1 | TIMER_OFF | |
Integer RW | 21 | | TIME_ON_HOUR | |
Integer RW | 22 | | TIME_ON_MINUTE | |
Integer RW | 23 | | TIME_OFF_HOUR | |
Integer RW | 24 | | TIME_OFF_MINUTE | |
Integer RW | 25 | | DS18B20_ENV | . |
Integer RW | 26 | | DS18B20_NOZ | . |
, EEPROM .
3 (CFG_*) , EEPROM.
3-7 . 3 . / . , .
4 , RTC. BCD , — 12:34 0x1234.
5 RTC.
6-7 DS18B20. T*100, .. 25.67°=2567. 2 , - .
25-26 2 . . 25-26. , 6-7. , .
8-26 EEPROM.
:
- Arduino Pro Mini.
- NRF24L01+ — 2.4
- LM1117-3.3 — 3.3 NRF24L01+
- DS1302 — RTC
- 32768 RTC
- DS18B20 — . 2
- — , ,








. . , .
- - .
mini-USB - . , . , 220 . USB A-B.
«» Arduino Mega2560 NRF24L01+ LM1117-3.3. 3.3 ( 470*16) . 2560 3.3 , . .
2560 USB 10 .
OpenHAB
Arduino & OpenHAB Modbus Binding, , , . .
Modbus Binding#
modbus:serial.ac_hall_state.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_state.id=1
modbus:serial.ac_hall_state.start=48
modbus:serial.ac_hall_state.length=5
modbus:serial.ac_hall_state.type=discrete
#
modbus:serial.ac_hall_power.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_power.id=1
modbus:serial.ac_hall_power.start=56
modbus:serial.ac_hall_power.length=4
modbus:serial.ac_hall_power.type=coil
#
modbus:serial.ac_hall_rtc.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_rtc.id=1
modbus:serial.ac_hall_rtc.start=4
modbus:serial.ac_hall_rtc.length=1
modbus:serial.ac_hall_rtc.type=holding
#
modbus:serial.ac_hall_temperature.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_temperature.id=1
modbus:serial.ac_hall_temperature.start=6
modbus:serial.ac_hall_temperature.length=2
modbus:serial.ac_hall_temperature.type=holding
modbus:serial.ac_hall_temperature.valuetype=int16
#
modbus:serial.ac_hall_mode.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_mode.id=1
modbus:serial.ac_hall_mode.start=8
modbus:serial.ac_hall_mode.length=1
modbus:serial.ac_hall_mode.type=holding
#
modbus:serial.ac_hall_temp.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_temp.id=1
modbus:serial.ac_hall_temp.start=9
modbus:serial.ac_hall_temp.length=4
modbus:serial.ac_hall_temp.type=holding
#
modbus:serial.ac_hall_fan.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_fan.id=1
modbus:serial.ac_hall_fan.start=13
modbus:serial.ac_hall_fan.length=5
modbus:serial.ac_hall_fan.type=holding
#
modbus:serial.ac_hall_swing.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_swing.id=1
modbus:serial.ac_hall_swing.start=18
modbus:serial.ac_hall_swing.length=2
modbus:serial.ac_hall_swing.type=holding
#
modbus:serial.ac_hall_timer.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_timer.id=1
modbus:serial.ac_hall_timer.start=320
modbus:serial.ac_hall_timer.length=2
modbus:serial.ac_hall_timer.type=coil
#
modbus:serial.ac_hall_timer_time.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_timer_time.id=1
modbus:serial.ac_hall_timer_time.start=21
modbus:serial.ac_hall_timer_time.length=4
modbus:serial.ac_hall_timer_time.type=holding
# DS18B20
modbus:serial.ac_hall_ds18b20.connection=/dev/ttyACM0:57600:8:none:1:rtu
modbus:serial.ac_hall_ds18b20.id=1
modbus:serial.ac_hall_ds18b20.start=25
modbus:serial.ac_hall_ds18b20.length=2
modbus:serial.ac_hall_ds18b20.type=holding
itemsContact AC_HALL_STATE_POWER "AC_HALL_STATE_POWER [MAP(air_cond.map):%s]" (){modbus="ac_hall_state:0"}
Contact AC_HALL_STATE_OXYGEN "AC_HALL_STATE_OXYGEN [MAP(air_cond.map):%s]" (){modbus="ac_hall_state:1"}
Contact AC_HALL_STATE_ION "AC_HALL_STATE_ION [MAP(air_cond.map):%s]" (){modbus="ac_hall_state:2"}
Contact AC_HALL_STATE_QUIET "AC_HALL_STATE_QUIET [MAP(air_cond.map):%s]" (){modbus="ac_hall_state:3"}
Contact AC_HALL_STATE_TIMER "[MAP(air_cond.map):%s]" (){modbus="ac_hall_state:4"}
Switch AC_HALL_CONTROL_POWER "" <climate> (){modbus="ac_hall_power:0"}
Switch AC_HALL_CONTROL_OXYGEN " O2" (){modbus="ac_hall_power:1"}
Switch AC_HALL_CONTROL_ION "" (){modbus="ac_hall_power:2"}
Switch AC_HALL_CONTROL_QUIET " " (){modbus="ac_hall_power:3"}
Number AC_HALL_RTC "RTC[%x]" (){modbus="ac_hall_rtc:0"}
String AC_HALL_RTC_S " [%s]" <clock> ()
Group gAC_HALL_TEMPERATURE "Living Room temp"
Number AC_HALL_TEMPERATURE_ENV "[%d]" (){modbus="ac_hall_temperature:0"}
Number AC_HALL_TEMPERATURE_NOZ "[%d]" (){modbus="ac_hall_temperature:1"}
Number AC_HALL_TEMPERATURE_ENVF " [%.2f °C]" <temperature> (gAC_HALL_TEMPERATURE)
Number AC_HALL_TEMPERATURE_NOZF " [%.2f °C]" <temperature> (gAC_HALL_TEMPERATURE)
Number AC_HALL_DS18B20_ENV "ENV[%x]" (){modbus="ac_hall_ds18b20:0"}
Number AC_HALL_DS18B20_NOZ "NOZZLES[%x]" (){modbus="ac_hall_ds18b20:1"}
Number AC_HALL_MODE "" (){modbus="ac_hall_mode:0"}
Number AC_HALL_TEMP_AUTO "[%d °C]" <temperature> (){modbus="ac_hall_temp:0"}
Number AC_HALL_TEMP_COOL "[%d °C]" <temperature> (){modbus="ac_hall_temp:1"}
Number AC_HALL_TEMP_HEAT "[%d °C]" <temperature> (){modbus="ac_hall_temp:2"}
Number AC_HALL_TEMP_DRY "[%d °C]" <temperature> (){modbus="ac_hall_temp:3"}
Number AC_HALL_FAN_AUTO "[%d]" (){modbus="ac_hall_fan:0"}
Number AC_HALL_FAN_COOL "[%d]" (){modbus="ac_hall_fan:1"}
Number AC_HALL_FAN_HEAT "[%d]" (){modbus="ac_hall_fan:2"}
Number AC_HALL_FAN_DRY "[%d]" (){modbus="ac_hall_fan:3"}
Number AC_HALL_FAN_SPEED "[%d]" (){modbus="ac_hall_fan:4"}
Number AC_HALL_SWINGV "" (){modbus="ac_hall_swing:0"}
Number AC_HALL_SWINGH "" (){modbus="ac_hall_swing:1"}
Switch AC_HALL_TIMER_ON " " <clock> (){modbus="ac_hall_timer:0"}
Switch AC_HALL_TIMER_OFF " " <clock> (){modbus="ac_hall_timer:1"}
Number AC_HALL_TIME_ON_HR "[%02d]" (){modbus="ac_hall_timer_time:0"}
Number AC_HALL_TIME_ON_MI "[%02d]" (){modbus="ac_hall_timer_time:1"}
Number AC_HALL_TIME_OFF_HR "[%02d]" (){modbus="ac_hall_timer_time:2"}
Number AC_HALL_TIME_OFF_MI "[%02d]" (){modbus="ac_hall_timer_time:3"}
, HH:MM.
rulesimport org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import java.io.File
rule "Update AC_HALL ENV temp"
when
Item AC_HALL_TEMPERATURE_ENV received update
then
var Number T = AC_HALL_TEMPERATURE_ENV.state as DecimalType
var Number H = T/100
postUpdate(AC_HALL_TEMPERATURE_ENVF, H)
end
rule "Update AC_HALL NOZZLES temp"
when
Item AC_HALL_TEMPERATURE_NOZ received update
then
var Number T = AC_HALL_TEMPERATURE_NOZ.state as DecimalType
var Number H = T/100
postUpdate(AC_HALL_TEMPERATURE_NOZF, H)
end
rule "Update AC_HALL_RTC clock"
when
Item AC_HALL_RTC received update
then
var Number T = AC_HALL_RTC.state as DecimalType
var H = T.intValue / 256
var M = T.intValue % 256
var S = String::format("%02x:%02x",H,M)
postUpdate(AC_HALL_RTC_S, S)
end
sitemapssitemap demo label="Demo House"{
Frame label="HOME"{
Text label=" " icon="ac_cond"{
Frame label="" {
Switch item= AC_HALL_CONTROL_POWER labelcolor=[AC_HALL_STATE_POWER==OPEN="blue"]
Switch item= AC_HALL_CONTROL_OXYGEN labelcolor=[AC_HALL_STATE_OXYGEN==OPEN="blue"]
Switch item= AC_HALL_CONTROL_ION labelcolor=[AC_HALL_STATE_ION==OPEN="blue"]
Switch item= AC_HALL_CONTROL_QUIET labelcolor=[AC_HALL_STATE_QUIET==OPEN="blue"]
Text item=AC_HALL_STATE_TIMER labelcolor=[AC_HALL_STATE_TIMER==OPEN="blue"] icon="clock-on"
Text item=AC_HALL_RTC_S
Text item=AC_HALL_TEMPERATURE_ENVF
Text item=AC_HALL_TEMPERATURE_NOZF
}
Frame label=""{
Selection item=AC_HALL_MODE label="" mappings=[1=AUTO, 2=COOL, 4=HEAT, 8=DRY, 16=FAN]
Text item=AC_HALL_TEMP_AUTO visibility=[AC_HALL_MODE==1]
Text item=AC_HALL_TEMP_COOL visibility=[AC_HALL_MODE==2]
Text item=AC_HALL_TEMP_HEAT visibility=[AC_HALL_MODE==4]
Text item=AC_HALL_TEMP_DRY visibility=[AC_HALL_MODE==8]
Text item=AC_HALL_FAN_AUTO visibility=[AC_HALL_MODE==1]
Text item=AC_HALL_FAN_COOL visibility=[AC_HALL_MODE==2]
Text item=AC_HALL_FAN_HEAT visibility=[AC_HALL_MODE==4]
Text item=AC_HALL_FAN_DRY visibility=[AC_HALL_MODE==8]
Text item=AC_HALL_FAN_SPEED visibility=[AC_HALL_MODE==16]
Selection item=AC_HALL_SWINGV label="" mappings=[1=AUTO, 2="0°", 4="15°", 8="30°", 16="45°", 32="60°"]
Selection item=AC_HALL_SWINGH label="" mappings=[1=AUTO, 4="/ /", 8="/ |", 2="| |", 16="| \\", 32="\\ \\"]
Text label="" icon="settings"{
Frame label="AUTO"{
Setpoint item=AC_HALL_TEMP_AUTO minValue=16 maxValue=30 step=1
Switch item=AC_HALL_FAN_AUTO mappings=[0=AUTO, 1="1", 2="2", 3="3", 4="4", 5="5"]
}
Frame label="COOL"{
Setpoint item=AC_HALL_TEMP_COOL minValue=16 maxValue=30 step=1
Switch item=AC_HALL_FAN_COOL mappings=[0=AUTO, 1="1", 2="2", 3="3", 4="4", 5="5"]
}
Frame label="HEAT"{
Setpoint item=AC_HALL_TEMP_HEAT minValue=16 maxValue=30 step=1
Switch item=AC_HALL_FAN_HEAT mappings=[0=AUTO, 1="1", 2="2", 3="3", 4="4", 5="5"]
}
Frame label="DRY"{
Setpoint item=AC_HALL_TEMP_DRY minValue=16 maxValue=30 step=1
Switch item=AC_HALL_FAN_DRY mappings=[0=AUTO, 1="1", 2="2", 3="3", 4="4", 5="5"]
}
Frame label="FAN"{
Switch item=AC_HALL_FAN_SPEED mappings=[0=AUTO, 1="1", 2="2", 3="3", 4="4", 5="5"]
}
Frame label=""{
Text item=AC_HALL_DS18B20_ENV
Text item=AC_HALL_DS18B20_NOZ
}
}
}
Frame label="" {
Switch item= AC_HALL_TIMER_ON labelcolor=[AC_HALL_STATE_TIMER==OPEN="blue"]
Setpoint item=AC_HALL_TIME_ON_HR minValue=0 maxValue=23 step=1
Setpoint item=AC_HALL_TIME_ON_MI minValue=0 maxValue=50 step=5
Switch item= AC_HALL_TIMER_OFF labelcolor=[AC_HALL_STATE_TIMER==OPEN="blue"]
Setpoint item=AC_HALL_TIME_OFF_HR minValue=0 maxValue=23 step=1
Setpoint item=AC_HALL_TIME_OFF_MI minValue=0 maxValue=50 step=5
}
}
Text item=AC_HALL_RTC_S
Text item=AC_HALL_TEMPERATURE_ENVF{
Frame label=" "{
Chart item=gAC_HALL_TEMPERATURE period=h refresh=60000
}
Frame label=" 4 " {
Chart item=gAC_HALL_TEMPERATURE period=4h refresh=600000
}
}
}
}
:



. WiFI. VPN- OpenHAB , .
.
, , — . — .
.
.
- , . , - .
!
- Arduino library ModbusRtu Modbus-Master-Slave-for-Arduino
- Arduino library ModbusRtuRF24 Modbus-over-RF24Network-for-Arduino