Menambahkan Counter SDM-220 ke OpenHab

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 panel

Bus 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; +-------------------+ | Tables_in_openhab | +-------------------+ | Item1 | | Item2 | | Item3 | | Item4 | | Items | +-------------------+ 5 rows in set (0.00 sec) mysql> select * from Items; +--------+--------------------------+ | ItemId | ItemName | +--------+--------------------------+ | 1 | sdm220_voltage | | 2 | sdm220_actpower | | 3 | sdm220_actcounter | | 4 | sdm220_current | +--------+--------------------------+ 4 rows in set (0.00 sec) 

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.

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


All Articles