
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°);
- (, "| |", "/ /", "/ |", "| \", "\ \" );
- (, );
- ;
- ;
- (, );
- (, );
. .
Modbus| Type | 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