Wireless Home Air Conditioner Controller OpenHAB melalui Modbus via RF24Network


Setelah artikel pertama saya tentang mengendalikan AC dengan controller, sedikit lebih dari 2 tahun berlalu. Selama waktu ini, gagasan untuk mengendalikan AC jarak jauh tidak meninggalkan saya dan memiliki beberapa kelahiran kembali. Kondisi utama adalah tidak adanya kabel ke AC.

Artinya, kontrol pengontrol harus nirkabel.

Latar Belakang


Prototipe pertama adalah Arduino UNO. Dia menerima tim di UART dan tahu cara menghidupkan dan mematikan AC. Karena ada sedikit pengertian praktis dari arduinka yang terhubung ke komputer yang berfungsi, kepala terus mencari kesempatan untuk menghubungkan yang terakhir ke server rumah. Tidak ada visibilitas langsung dari server ke pelakunya semua teka-teki. Maksimumnya adalah soket dengan LAN di semua komputer yang berfungsi sama - karena berdiri hampir di seberang AC. Perisai Ethernet tidak tersedia. Tetapi mengingat bahwa di suatu tempat di zashashnik terdapat modem d-link DSL-2500U dsl yang sudah lama tidak digunakan, dengan hanya satu port on board. Keinginan untuk memberikan kehidupan kedua pada sepotong besi menyebabkan googling, yang, pada gilirannya, secara ajaib menyebabkan artikel Mengubah modem ADSL menjadi perisai Ethernet untuk Arduino / CraftDuino .

Melompat kedepan dan melewatkan proses pembuatan custom firmware yang menarik, saya masih berhasil mendapatkan modem untuk mendengarkan port yang diinginkan dan "meneruskan" UART melaluinya. Jadi, pada server rumah, saya bisa mengirim perintah untuk menghidupkan / mematikan port ke alamat modem lokal, yang akan menuju arduino yang terhubung dengannya.

Tetapi artikel ini bukan tentang itu. Solusi utama menggunakan protokol Modbus dan jaringan nirkabel RF24Network . Dan semuanya dikendalikan di OpenHAB.


Selama dua tahun ini, saya berhasil memesan banyak nishtyaks dari Cina dan kebanyakan dari mereka menunggu di sayap. Daftar ini termasuk modul NRF24L01 +, dibeli oleh segelintir untuk eksperimen. Dan dia akan pergi lebih jauh ke suatu tempat di dalam lemari idle, jika suatu hari saya tidak menemukan serangkaian artikel:

dari BorichTerima kasih untuk itu!

Berkat mereka, saya berkenalan dengan protokol Modbus. Tetapi yang paling penting, saya menemukan OpenHAB untuk diri saya sendiri - apa yang sudah lama saya cari. Ini mendorong saya untuk mulai menerapkan ide-ide lama.

Setelah bermain-main dengan contoh-contoh dari artikel, saya memutuskan untuk mencoba memisahkan controller dan server menggunakan ethernet-shield dari modem yang dijelaskan di atas. Solusi ini memungkinkan kami untuk mencapai tugas yang diajukan - perisai dan pengontrol berada di desktop, tanpa menggunakan komputer yang berfungsi, pada saat yang sama, perisai selalu terhubung ke jaringan lokal dan dapat diakses dari server rumah.

Tetapi keputusan ini ditakdirkan untuk gagal.
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 .

, . . , .


Ide


Dan akhirnya saya membuktikan diri bahwa saya perlu membuat pengontrol yang dapat diakses melalui udara. Modul NRF24L01 + tidak hilang! .. Benar, ini membutuhkan setidaknya dua pengendali - satu melakukan peran langsung, yang kedua memainkan peran router. Yang kedua harus terhubung ke server dan melalui itu komunikasi nirkabel dengan yang lain dilakukan. Saat menghubungkan ke sana, kami menentukan ID bawahan kepada siapa paket itu dimaksudkan. Ternyata banyak budak tersedia di satu port serial. Ya - ini adalah jaringan nirkabel berbasis Modbus.

Modbus, omong-omong, memungkinkan untuk membangun jaringan dengan satu master - banyak bawahan. Dan perpustakaan RF24Network - untuk membuat semuanya nirkabel, dan bahkan dengan routing otomatis antara node jaringan.

Pengembangan Perpustakaan untuk Arduino


Untuk mengimplementasikan solusi semacam itu, perlu sedikit waktu untuk memodifikasi perpustakaan Modbus-Master-Slave-untuk-Arduino agar dapat mewarisinya dan membebani beberapa metode. Implementasi saya juga diperbarui (library.properties ditambahkan, file library dibagi menjadi header dan body) untuk Arduino IDE 1.6.5 terbaru.

Perpustakaan Modbus-over-RF24Network-for-Arduino memungkinkan Anda untuk menerapkan dua perilaku yang mungkin - Proxy dan Slave. Contoh ModbusRF24Proxy sebenarnya merupakan implementasi dari "router" dan tidak memerlukan modifikasi apa pun selain pengaturan pin yang diperlukan.
Contoh ModbusRF24Proxy
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <ModbusRtu.h>
#include <ModbusRtuRF24.h>

#define stlPin  13  //     (   Arduino)

// nRF24L01(+) radio attached using Getting Started board 
RF24 radio(9, 10);

// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = 0;

//  ,   TX
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(/*channel*/ 90, /*node address*/ this_node);

    //    100 
    tempus = millis() + 100;
    digitalWrite(stlPin, HIGH);
}

void io_setup() {
    digitalWrite(stlPin, HIGH);
    pinMode(stlPin, OUTPUT);
}

void loop() {

    // Pump the network regularly
    network.update();

    //  
    state = proxy.proxy();

    //      -    50  
    if (state > 4) {
        tempus = millis() + 50;
        digitalWrite(stlPin, HIGH);
    }
    if (millis() > tempus) digitalWrite(stlPin, LOW);
}


Router atau proxy menggunakan format konstruktor khusus:
//  ,   TX
ModbusRF24 proxy(network, 0, 0);

dan fungsi
proxy.proxy();

untuk memproses paket yang masuk pada port serial, kirim ke RF24Network, terima respons dari jaringan, kirim hasilnya kembali ke port serial.

Dalam implementasi ini, proksi memiliki alamat RF24Network nol:
// Address of our node
const uint16_t this_node = 0;

- yaitu ini adalah perangkat root dari jaringan. Jika perlu, posisi dalam topologi pengontrol proksi dapat diubah.

Contoh Modbus RF24Slave
Arduino & 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  //   

// nRF24L01(+) radio attached using Getting Started board 
RF24 radio(9, 10);

// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = ID;

//  
ModbusRF24 slave(network, ID);

//   modbus
uint16_t au16data[11];

void io_setup() {
    digitalWrite(ledPin, LOW);
    pinMode(ledPin, OUTPUT);
    pinMode(btnPin, INPUT);
}

void io_poll() {
    // Coil[1]  Discrete[0]
    au16data[0] = au16data[1];
    //   1.3   
    digitalWrite(ledPin, bitRead(au16data[1], 3));
    //     0.3
    bitWrite(au16data[0], 3, digitalRead(btnPin));
    // Holding[5,6,7]  Input[2,3,4]
    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(/*channel*/ 90, /*node address*/ this_node);
}

void loop() {

    // Pump the network regularly
    network.update();

    if (network.available()) {
        slave.poll(au16data, 11);
    }
    //    Modbus    
    io_poll();
}



Konstruktor dalam kasus ini sudah berbeda:
//  
ModbusRF24 slave(network, ID);


Struktur Daftar Modbus


Setelah usaha pertama yang berhasil mengendalikan AC dengan kemampuan hanya menyalakan dan mematikan nafsu makan saya hanya meningkat. Sekarang ini belum cukup, dan karena saya memiliki fungsionalitas OpenHAB dalam aplikasi mobile saya, itu seharusnya melakukan semua fungsi minimum dari panel kontrol asli.
Ini berarti di sini adalah daftar fitur paling tidak:
  • indikasi status saat ini
  • menyalakan dan mematikan AC, mode individual (O 2 , ionisasi, mode diam);
  • pemilihan mode saat ini (otomatis, pemanasan, pendinginan, drainase, kipas);
  • indikasi suhu dan kecepatan kipas untuk setiap mode. Untuk mode kipas, hanya kecepatan;
  • pengaturan tirai vertikal (otomatis, 0 Β°, 15 Β°, 30 Β°, 45 Β°, 60 Β°);
  • pengaturan tirai horizontal (otomatis, "| |", "/ /", "/ |", "| \", "\ \");
  • pengaturan waktu (jam, menit);
  • pada pengaturan timer;
  • pengaturan off timer;
  • pengaturan tepat waktu (jam, menit);
  • pengaturan waktu shutdown (jam, menit);

Selama proses pengembangan, struktur register telah berubah berkali-kali dengan saya. Versi saat ini di bawah di bawah spoiler.
Register Modbus
TypeByteBitName
Bit RO00CFG_OXYGEN1 β€”
Bit RO1CFG_ION1 β€”
Bit RO2CFG_QUIET1 β€”
Bit RO3CFG_TIMER1 β€” /
Bit RO4CFG_DELAY1 β€” /
Bit RO5CFG_SWING1 β€”
Bit RO6CFG_SWINGH1 β€”
Bit RO7CFG_SWINGV1 β€”
Bit RO8CFG_CLOCK1 β€”
Bit RO9
Bit RO10
Bit RO11CFG_AUTO1 β€” AUTO
Bit RO12CFG_COOL1 β€” COOL
Bit RO13CFG_HEAT1 β€” HEAT
Bit RO14CFG_DRY1 β€” DRY
Bit RO15CFG_FAN1 β€” FAN
Integer RO1CFG_TEMP. . : Min + Max*256
Integer RO2CFG_FAN_SPEEDFAN
Bit RO30STATE_POWER:0 β€” , 1 β€”
Bit RO1STATE_OXYGEN:0 β€” , 1 β€”
Bit RO2STATE_ION:0 β€” , 1 β€”
Bit RO3STATE_QUIET:0 β€” , 1 β€”
Bit RO4STATE_TIMER:0 β€” , 1 β€”
Bit RW8CONTROL_POWER
Bit RW9CONTROL_OXYGEN
Bit RW10CONTROL_ION
Bit RW11CONTROL_QUIET
Integer RO4RTC_HR_MI0x1308
Integer RW5RTCW_HR_MI0x1308
Integer RO6TEMPERATURE1. INT16,
Integer RO7TEMPERATURE2. INT16,
Bit RW80MODE_AUTO
Bit RW1MODE_COOL
Bit RW2MODE_HEAT
Bit RW3MODE_DRY
Bit RW4MODE_FAN
Integer RW9TEMP_AUTOAUTO
Integer RW10TEMP_COOLCOOL
Integer RW11TEMP_HEATHEAT
Integer RW12TEMP_DRYDRY
Integer RW13FAN_AUTOAUTO. 0: Auto
Integer RW14FAN_COOLCOOL. 0: Auto
Integer RW15FAN_HEATHEAT. 0: Auto
Integer RW16FAN_DRYDRY. 0: Auto
Integer RW17FAN_SPEEDFAN. 0: Auto
Bit RW180SWING_AUTO
Bit RW1SWINGV_00Β°
Bit RW2SWINGV_1515Β°
Bit RW3SWINGV_3030Β°
Bit RW4SWINGV_4545Β°
Bit RW5SWINGV_6060Β°
Bit RW190SWINGH_AUTO
Bit RW1SWINGH_VV|  |
Bit RW2SWINGH_LL/  /
Bit RW3SWINGH_LV/  |
Bit RW4SWINGH_VR|  \
Bit RW5SWINGH_RR\  \
Bit RW200TIMER_ON
Bit RW1TIMER_OFF
Integer RW21TIME_ON_HOUR
Integer RW22TIME_ON_MINUTE
Integer RW23TIME_OFF_HOUR
Integer RW24TIME_OFF_MINUTE
Integer RW25DS18B20_ENV.
Integer RW26DS18B20_NOZ.


Register diatur sedemikian rupa sehingga seluruh array data diinisialisasi dari EEPROM ketika controller dimulai.
3 register pertama (CFG_ *) berisi konfigurasi fitur, mereka tidak pernah berubah dan diinisialisasi oleh firmware EEPROM.
Register 3-7 selalu menampilkan status pengontrol saat ini. Bit register 3 yang tinggi digunakan untuk mengubah status. Perubahan mereka memulai on / off dari AC dan mode khusus. Setelah perintah dieksekusi, bit orde rendah dari register ini disalin ke yang orde tinggi.
Daftar 4 berisi waktu pengontrol saat ini, yang dibaca dari RTC. Nilai disimpan dalam format BCD, sehingga ketika register ditampilkan dalam notasi heksadesimal, waktu dibaca seperti - 12:34 adalah 0x1234.
Register 5 digunakan untuk mengubah waktu RTC.
Register 6-7 berisi suhu dari sensor DS18B20. Nilai berisi bilangan bulat yang ditandatangani dan sama dengan T * 100, yaitu 25.67 Β° C = 2567. Maksimal 2 sensor disediakan, tetapi jumlahnya dapat dengan mudah diubah dengan memperluas tabel register untuk menyimpan alamat sensor dan suhunya.
2 byte terakhir dari alamat sensor disimpan dalam register 25-26. Saat mengganti sensor, setel ulang register alamat yang sesuai. Ketika sensor baru terdeteksi, alamatnya diperiksa keberadaannya di register 25-26. Jika alamatnya ada di tabel, nilai suhu sensor dimasukkan dalam register yang sesuai 6-7. Jika alamat tidak dalam tabel dan tabel memiliki sel nol, alamat sensor saat ini ditulis dalam sel bebas.
Register 8-26, ketika dimodifikasi oleh pengguna, disimpan di EEPROM.

Kelenjar


Perangkat keras terdiri dari komponen-komponen berikut:
  1. Arduino Pro Mini.
    Arduino Pro Mini NEW
  2. NRF24L01+ β€” 2.4
  3. LM1117-3.3 β€” 3.3 NRF24L01+
  4. DS1302 β€” RTC
  5. 32768 RTC
  6. DS18B20 β€” . 2
  7. β€” , ,











Umpan balik dengan AC diwujudkan dengan menghubungkan optocoupler ke LED yang sesuai. Dengan demikian, isolasi galvanik dengan sirkuit listrik pendingin udara dipastikan. Arus input untuk optocoupler dipilih secara eksperimental menggunakan resistor sehingga output optocoupler terbuka dan kecerahan LED utama pada AC tidak turun.

LED IR dipasang di sebelah penerima inframerah AC.

Kontroler ini ditenagai oleh pengisian mini-USB dari beberapa jenis keajaiban Tiongkok. Kontak voltase listrik Cina dilepas dari kasing, kabel dilepas. Pengisian sendiri menetap di dalam usus AC, terhubung ke input 220 secara paralel dengannya. Pengontrol terhubung ke pengisian dengan kabel USB AB biasa.

Kontroler "router" didasarkan pada Arduino Mega2560 dan NRF24L01 + dengan LM1117-3.3 yang terpisah. Selain catu daya 3,3 terpisah, elektrolit terhubung ke modul nirkabel (saya menemukannya di 470 uF * 16 v) pada kaki daya. Seperti yang Anda ketahui, bus internal 3.3G Mega2560 sangat bising dan modul menolak untuk mengirim data, meskipun itu menjawab dengan benar. Tetapi bahkan dengan catu daya terpisah tanpa kapasitor, sambungannya sangat tidak stabil.
Agar mega2560 tidak diatur ulang saat membuka port melalui USB, elektrolit 10ΞΌf terhubung ke pin reset.

Openhab


Artikel Arduino & OpenHAB menjelaskan fitur plug-in Binding Modbus, yang dengan setiap polling controller, plug-in mengirimkan peristiwa ke bus, bahkan jika tidak ada yang berubah. Saya mengikuti dan menyelesaikan plugin.

Konfigurasi Modbus Binding Plugin
#
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

Pengaturan item
Contact 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"}


Aturan digunakan untuk mengubah suhu bilangan bulat ke suhu nyata, serta untuk memformat waktu pengontrol ke bentuk HH: MM.
Pengaturan aturan
import 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


Pengaturan peta situs
sitemap 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
                        }
                }
        }
}



Hasilnya terlihat seperti ini melalui browser:

Kesimpulan


Saya senang dengan hasilnya sebagai gajah. Kontrol AC sekarang tersedia untuk saya di mana pun ada Internet seluler atau WiFI. Menggunakan klien VPN di smartphone, OpenHAB di server rumah saya menjadi dapat diakses oleh saya baik melalui browser maupun melalui aplikasi seluler.
Solusi nirkabel memungkinkan untuk mengintegrasikan pengontrol dengan AC.
Kehadiran umpan balik memberi keyakinan bahwa perintah yang dikirim diterima oleh AC, dan sensor suhu menunjukkan dengan jelas ini - setelah beberapa detik Anda dapat mengamati perubahan pembacaan suhu di outlet AC. Nah, setelah beberapa menit - dan suhu sekitar.
Sangat menarik untuk mengamati profil AC ketika mendekati kondisi yang diberikan.

Tidak diragukan lagi ini bukan satu-satunya pengendali nirkabel yang akan saya gunakan.

Ada rencana untuk menggunakan penerima IR dari AC itu sendiri untuk membaca perintah remote control asli untuk memperbarui pengaturan di controller. Selain itu, penerima IR itu sendiri sudah terhubung melalui optocoupler ke controller.

Baca sampai akhir, terima kasih khusus!

Referensi


  1. Arduino library ModbusRtu Modbus-Master-Slave-untuk-Arduino
  2. Pustaka Arduino ModbusRtuRF24 Modbus-over-RF24 Network-for-Arduino

Source: https://habr.com/ru/post/id384243/


All Articles