Hampir satu tahun telah berlalu sejak
publikasi pertama saya tentang meteran listrik dengan antarmuka RS485 / ModBus
SDM-220 , lalu ada
artikel kedua tentang cara mengumpulkan data darinya dan memproses statistik. Ini yang ketiga, semoga yang terakhir. Dia tentang bagaimana mengintegrasikan penghitung dengan
OpenHab . Hasilnya akhirnya baik-baik saja dengan saya.

Jadi, upaya pertama untuk mengumpulkan statistik dari konter dilakukan menggunakan layanan cloud eksternal
ThingSpeak . Sebagai server lokal yang melakukan polling penghitung, kami menggunakan thin client (komputer mini) dengan
Ubuntu Server diinstal pada USB stick. Ini adalah kesalahan pertama - flash drive "mati" setelah 3 bulan (kecelakaan, saya pikir). Setelah tidak membuat kesimpulan, saya membunuh flash drive kedua dalam 2 bulan (keteraturan). Pada versi ketiga, kantong usb dengan sekrup 2,5 "sudah digunakan sebagai tempat penyimpanan.
Layanan ThingSpeak sendiri memungkinkan pemrosesan, tetapi tidak memberikan fleksibilitas yang cukup dengan manipulasi data. Data per hari, misalnya, dikumpulkan sebagai jumlah data per jam. Jika beberapa paket data tidak tiba di server atau saya mengirim beberapa data selama pengujian, kesalahan terjadi. Pikiran bahwa akan diperlukan untuk menjaga akuntansi dua tingkat dengan mengacu pada waktu hari tidak ditambahkan optimisme.
Secara umum, saya memutuskan untuk belajar
OpenHab .
Tugas pertama: untuk mendapatkan data mentah dari counter.
Instalasi OpenHab sendiri dirinci dalam
instruksi . Setelah instalasi, Anda perlu menginstal
ModBus binding -
binding-modbus1 - 1.9.0 melalui
Paper UI β Bindings panelBus Modus disurvei melalui adaptor USB-RS485, jadi Anda perlu memastikan bahwa adaptor ada di sistem dan menambahkan hak akses pengguna openhab ke port:
lsusb Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC ls /dev/ttyUSB* /dev/ttyUSB0 sudo adduser openhab dialout sudo adduser openhab tty
Maka disarankan untuk mengkonfigurasi izin untuk Java (ini juga dijelaskan secara rinci dalam petunjuk instalasi OpenHab):
sudo vi /etc/default/openhab2 EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyUSB0"
Setelah manipulasi ini, Anda perlu mengkonfigurasi file konfigurasi
services / modbus.cfg :
sudo vi /etc/openhab2/services/modbus.cfg # poll=30000 # , . start - . connection (9600,8,n,1), . # - 0x00 serial.slave1.connection=/dev/ttyUSB0:9600:8:none:1:rtu:2000:1000:none:none serial.slave1.type=input serial.slave1.start=0 serial.slave1.length=2 serial.slave1.valuetype=float32 # - 0x06 serial.slave2.connection=/dev/ttyUSB0:9600:8:none:1:rtu:2000:1000:none:none serial.slave2.type=input serial.slave2.start=6 serial.slave2.length=2 serial.slave2.valuetype=float32 # - 0x0C serial.slave3.connection=/dev/ttyUSB0:9600:8:none:1:rtu:2000:1000:none:none serial.slave3.type=input serial.slave3.start=12 serial.slave3.length=2 serial.slave3.valuetype=float32 # ( ) - 0x156 serial.slave4.connection=/dev/ttyUSB0:9600:8:none:1:rtu:2000:1000:none:none serial.slave4.type=input serial.slave4.start=342 serial.slave4.length=2 serial.slave4.valuetype=float32
Maka Anda perlu membuat
item data dalam file
items / sdm220.items :
sudo vi /etc/openhab2/items/sdm220.items # Group gSDM220 # , , energy - Number sdm220_voltage " [%.1f ]" <energy> (gSDM220) {modbus="slave1:0"} Number sdm220_current " [%.2f ]" <energy> (gSDM220) {modbus="slave2:0"} Number sdm220_actpower " [%.1f ]" <energy> (gSDM220) {modbus="slave3:0"} Number sdm220_actcounter " [%.1f *]" <energy> (gSDM220) {modbus="slave4:0"}
Tetap menambahkan bacaan saat ini di dasbor. Untuk melakukan ini, edit file
sitemaps / default.sitemap :
sudo vi /etc/openhab2/sitemaps/default.sitemap sitemap default label="alk0v SmartHome (default sitemap)" { Frame label="" { Text item=sdm220_voltage Text item=sdm220_current Text item=sdm220_actpower Text item=sdm220_actcounter } }
Pada prinsipnya, ini cukup untuk melihat pembacaan meter saat ini:

Tugas Dua: Konfigurasikan HabPanel dan Visualisasikan Bacaan
OpenHab mendukung beberapa panel kontrol. Dari luar, aku paling suka
HabPanel . Melalui
Kertas UI β Antarmuka Pengguna, instal
HabPanel -
ui-habpanel - 2.0.0 .
Untuk menggambar grafik, Anda juga perlu menyimpan data di suatu tempat. OpenHab menggunakan istilah
Persistence untuk database. Saya ingin menggunakan database MySQL, komunitas mendiskusikan banyak masalah dengan database ini, pada akhirnya saya menemukan
instruksi yang bekerja untuk saya juga.
Jadi, instal MySQL Persistence (persistence-mysql - 1.9.0).
Instal MySQL:
sudo apt-get install mysql-server sudo mysql -u root -p
Siapkan alas:
CREATE DATABASE OpenHAB; CREATE USER 'openhab'@'localhost' IDENTIFIED BY 'YOURPASSWORD'; GRANT ALL PRIVILEGES ON OpenHAB.* TO 'openhab'@'localhost'; quit
Mulai kembali openhab:
sudo service openhab2 stop sudo service openhab2 start
Edit
layanan / mysql.cfg :
# the database url like 'jdbc:mysql://<host>:<port>/<database>' (without quotes) url=jdbc:mysql://localhost:3306/openhab # the database user user=openhab # the database password password=YOURPASSWORD
Edit
persistence / mysql.persist . Secara default, nilai semua Item akan dimasukkan ke dalam database dengan setiap perubahan:
Strategies { // if no strategy is specified for an item entry below, the default list will be used everyMinute : "0 * * * * ?" every5Minutes : "0 */5 * * * ?" everyHour : "0 0 * * * ?" everyDay : "0 0 0 * * ?" default = everyChange } Items { // persist all items once a day and on every change and restore them from the db at startup * : strategy = default, restoreOnStartup }
Jika semuanya dikonfigurasi dengan benar, tabel Item dan tabel ItemXX untuk setiap Item akan muncul di database.
mysql> use openhab; Database changed mysql> show tables; +
Sekarang Anda bisa membawa keindahan ke HabPanel.
Tambahkan Dasbor, tambahkan widget baru ke sana. Untuk menampilkan nilai, gunakan widget
Dummy , untuk menampilkan grafik -
Bagan . Semuanya intuitif di sini. Saya menyimpulkan parameter daya dan tegangan pada satu grafik menggunakan dua skala Y yang berbeda.
Tentukan mysql sebagai sumber data:

Tetapkan ambang batas untuk sumbu tegangan:

Tambahkan Item, tunjukkan warna dan jenis garis untuk mereka, untuk voltase menunjukkan sumbu Sekunder:

Kami mendapatkan hasilnya :)

Tugas ketiga: pengukuran listrik yang dikonsumsi setiap jam dan setiap hari
Menampilkan perubahan status dari waktu ke waktu adalah baik, tetapi saya juga ingin mendapatkan statistik konsumsi selama satu jam, hari, bulan. Artinya, tugasnya adalah secara berkala melakukan beberapa perhitungan. Di sinilah mesin aturan di OpenHab masuk.
Jadi, kami mengonfigurasi
Aturan .
Pertama, Anda perlu menambahkan Item baru ke
item / sdm220.items :
Number sdm220_hourcounter (gSDM220) Number sdm220_daycounter (gSDM220)
Kemudian buat file
rules / energy.rules , di mana Anda perlu menentukan 2 aturan: satu akan dieksekusi sekali dalam satu jam, yang kedua - sekali sehari.
rule "Energy by hour" when Time cron "0 0 * * * ?" then // . var hour = sdm220_actcounter.state as DecimalType - sdm220_actcounter.historicState(now.minusHours(1), "mysql":).state as DecimalType // logInfo("TEST","sdm220_hourcounter = "+hour) // Item postUpdate(sdm220_hourcounter, hour) end rule "Energy by day" when Time cron "0 0 0 * * ?" then var day = sdm220_actcounter.state as DecimalType - sdm220_actcounter.historicState(now.minusDays(1), "mysql":).state as DecimalType postUpdate(sdm220_daycounter, day)
Anda dapat menggunakan konsol OpenHab untuk debugging. Nama pengguna dan kata sandi standar: openhab / habopen. Anda dapat terhubung dengannya dengan perintah:
ssh -p 8101 openhab@localhost openhab> log:tail 19:22:00.012 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_hourcounter_day = 0.526123046875 19:22:00.014 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_daycounter = 10.861083984375 19:22:09.462 [INFO ] [marthome.event.ItemStateChangedEvent] - sdm220_current changed from 16.0433025360107421875 to 5.69449329376220703125 19:22:11.500 [INFO ] [marthome.event.ItemStateChangedEvent] - sdm220_actcounter changed from 2387.51904296875 to 2387.5458984375 19:22:13.532 [INFO ] [marthome.event.ItemStateChangedEvent] - sdm220_voltage changed from 192.7679595947265625 to 200.4195098876953125 19:22:15.568 [INFO ] [marthome.event.ItemStateChangedEvent] - sdm220_actpower changed from 2271.8486328125 to 1132.8717041015625 19:23:00.014 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_hourcounter_day = 0.515869140625 19:23:00.015 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_daycounter = 10.8769531250
Atau Anda dapat melihat file log:
tail -f /var/log/openhab2/openhab.log 2017-04-18 19:17:45.587 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'energy.rules' 2017-04-18 19:18:00.259 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_hourcounter_day = 0.571044921875 2017-04-18 19:18:00.272 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_daycounter = 10.8330078125 2017-04-18 19:19:00.015 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_daycounter = 10.83789062500 2017-04-18 19:19:00.025 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_hourcounter_day = 0.557861328125 2017-04-18 19:20:00.013 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_hourcounter_day = 0.55517578125 2017-04-18 19:20:00.024 [INFO ] [.eclipse.smarthome.model.script.TEST] - sdm220_daycounter = 10.859130859375
Saya berencana untuk mengubah meteran listrik utama menjadi meteran dua tarif, yang menurutnya listrik yang dikonsumsi dalam rentang pukul 23:00 hingga 07:00 dibayar dengan koefisien 0,5, jadi saya ingin melihat efek yang diharapkan dan menjaga meteran dua tarif. Pada awalnya, saya hanya menambahkan kondisi tambahan untuk waktu ke Item dan Aturan dan menambahkan bacaan siang dan malam ke dua tabel yang berbeda. Semuanya indah dalam database, tetapi tampak canggung pada bagan, karena bagan menghubungkan dua nilai terakhir dengan garis lurus:

Untuk menghibur rasa kecantikan saya, saya harus sedikit repot.
Jadi, skrip Aturan final untuk akuntansi dua tarif terlihat seperti ini:
rule "Energy by hour" when Time cron "0 0 * * * ?" then var hour = sdm220_actcounter.state as DecimalType - sdm220_actcounter.historicState(now.minusHours(1), "mysql":).state as DecimalType // if(now.getHourOfDay > 7 && now.getHourOfDay < 23) { logInfo("TEST","sdm220_hourcounter_day = "+hour) postUpdate(sdm220_hourcounter_day, hour) } else { // // primary key timestamp, if(now.getHourOfDay==7) { postUpdate(sdm220_hourcounter_night, hour) Thread::sleep(1000) postUpdate(sdm220_hourcounter_night, 0) Thread::sleep(1000) postUpdate(sdm220_hourcounter_day, 0) Thread::sleep(1000) postUpdate(sdm220_hourcounter_day, hour) } else if(now.getHourOfDay==23) { postUpdate(sdm220_hourcounter_day, hour) Thread::sleep(1000) postUpdate(sdm220_hourcounter_day,0) Thread::sleep(1000) postUpdate(sdm220_hourcounter_night, 0) Thread::sleep(1000) postUpdate(sdm220_hourcounter_night, hour) } else { postUpdate(sdm220_hourcounter_night, hour) } } postUpdate(sdm220_hourcounter, hour) end rule "Energy by day" when Time cron "0 0 0 * * ?" then var day = sdm220_actcounter.state as DecimalType - sdm220_actcounter.historicState(now.minusDays(1), "mysql":).state as DecimalType //night counter, 00:00..07:00 + 23:00..00:00 var day2 = sdm220_actcounter.historicState(now.minusHours(17),"mysql":).state as DecimalType - sdm220_actcounter.historicState(now.minusDays(1), "mysql":).state as DecimalType + sdm220_actcounter.state as DecimalType - sdm220_actcounter.historicState(now.minusHours(1),"mysql":).state as DecimalType //day counter, 07:00..23:00 var day1 = sdm220_actcounter.historicState(now.minusHours(1),"mysql":).state as DecimalType - sdm220_actcounter.historicState(now.minusHours(17),"mysql":).state as DecimalType logInfo("TEST","sdm220_daycounter_day = "+day1) logInfo("TEST","sdm220_daycounter_night = "+day2) logInfo("TEST","sdm220_daycounter = "+day) postUpdate(sdm220_daycounter, day) postUpdate(sdm220_daycounter_day, day1) postUpdate(sdm220_daycounter_night, day2) end
Sebelum mengedit skrip, tambahkan Item yang diperlukan:
Number sdm220_hourcounter_day (gSDM220) Number sdm220_hourcounter_night (gSDM220) Number sdm220_daycounter_day (gSDM220) Number sdm220_daycounter_night (gSDM220)
Sekarang bagan arus jam dan harian terlihat seperti ini:

Itu mungkin saja. Juga direncanakan untuk menambah perhitungan konsumsi listrik dan uang per bulan untuk tarif harian dan malam dan pembuatan laporan dengan mengirim melalui pos.