├── 3d.jpeg ├── LICENSE ├── README.md └── openhab-conf ├── exec ├── amper.sh └── electo_counters │ ├── README.txt │ ├── electro_counter.conf │ ├── electro_counter.sh │ ├── electro_counter200.sh │ ├── electro_counter230.sh │ ├── getinfo_var_1.sh │ ├── getinfo_var_2.sh │ ├── lib_funct.sh │ ├── merc200.sh │ └── merc230.sh ├── items └── default.items ├── persistence ├── mapdb.persist └── rrd4j.persist ├── rules └── default.rules ├── sitemaps └── default.sitemap ├── things └── default.things └── transform ├── curtains.map ├── door.map ├── motion.map ├── motion_astra.map ├── switch_ru.map └── water.map /3d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/empenoso/openHAB_one-room-apartment/c28555a1ad68e528f509222c3875d5b3518a5bac/3d.jpeg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mikhail Shardin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Полная домашняя автоматизация в новостройке 2 | Автоматизация была сделана при помощи многофункционального контроллера [MegaD-2561](https://www.ab-log.ru/smart-house/ethernet/megad-2561). 3 | 4 | Общее описание в [в статье на Хабре](https://habr.com/post/489610/). Подробности на [форуме](https://www.ab-log.ru/forum/viewtopic.php?f=1&t=1373). 5 | 6 | ![Квартира](https://github.com/empenoso/openHAB_one-room-apartment/blob/master/3d.jpeg) 7 | 8 | _________ 9 | :exclamation: ВНИМАНИЕ :exclamation: 10 | 11 | :point_right: Решил больше не пользоваться openHAB с лета 2019 года. Перешел на [Home Assistant](https://github.com/empenoso/Home-Assistant_one-room-apartment). :point_left: 12 | -------------------------------------------------------------------------------- /openhab-conf/exec/amper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sh /etc/openhab2/exec/electo_counters/electro_counter.sh amper 2>&1 | sed -n 's#^Amper=:[^0-9]*\([0-9.]*\)$#\1#p'; 3 | 4 | #bash /etc/openhab2/exec/amper.sh -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/README.txt: -------------------------------------------------------------------------------- 1 | # 2 | # Data read from electric meter 3 | # README 4 | # 2017-04-26 version 2.1 5 | # 2018-01-29 version 2.2 6 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 7 | # 8 | # version 2.2 9 | # 10 | # DONATE Поблагодарить 11 | # Всем, кто считает проделанную работу полезной, 12 | # есть возможность поддержать автора. 13 | # Карта ПриватБанка, Украина: 6762 4626 8013 0082. 14 | # Всем заранее спасибо. 15 | # 16 | 17 | В electro_counter.conf указать нужные: DEVICE, COUNTER_SN, PASS_READ, COUNTER_TYPE, ECHOCOMMAND 18 | запускать: sh electro_counter.sh <КОМАНДА> <НОМЕР СЧЕТЧИКА> <КОНФИГУРАЦИОННЫЙ ФАЙЛ> 19 | 20 | <КОМАНДА> - если не указана - команда kwatthour:all_time:T_ALL 21 | <НОМЕР СЧЕТЧИКА> - если не указан, берется из конфигурационного файла 22 | <КОНФИГУРАЦИОННЫЙ ФАЙЛ> - если не указан - берется файл конфигурации по умолчанию electro_counter.conf 23 | 24 | 25 | Перечень команд 26 | 27 | Mercury 230 28 | 29 | test Тестирование связи 30 | openread Открытие соединения на чтение 31 | openwrite Открытие соединения на запись 32 | close Завершение сеанса 33 | kwatthour Опрос накопленной энергии (по умолчанию, если никакая команда явно не указана) 34 | kwatthour:MODE:ZONE 35 | MODE может быть: 36 | all_time - по умолчанию за все время 37 | curr_year - за текущий год 38 | prior_year - за предыдущий год 39 | month - за месяц 40 | today - за сегодня 41 | yesterday - за вчера 42 | ZONE - зоны\тарифы 43 | T_ALL - общая сумма по всем тарифам - по умолчанию 44 | T1 45 | T2 46 | T3 47 | T4 48 | EXAMPLES 49 | kwatthour:today:T2 - накопленная энергия за текущие сутки по 2-му тарифу 50 | kwatthour:month=04:all_time - накопленная энергия за апрель по всем тарифам в сумме 51 | 52 | amper Сила тока A (А) по фазам 53 | coefw Коэффициент мощности (С) по фазам 54 | freq Частота Гц 55 | coin Угол между фазами 56 | power Мощность P (Вт) по фазам 57 | volt Напряжение U (В) 58 | null Произвольная команда (возможно описать любую команду) 59 | serialnum Серийный номер счетчика и даты выпуска 60 | version Версия ПО 61 | datetime Дата время по счетчику 62 | kwatthour_phaza Накопленная энергия по указанной фазе 63 | power_phaza Мощность P (Вт) по указанной фазе 64 | 65 | 66 | 67 | Mercury 200 68 | 69 | kwatthour Опрос накопленной энергии 70 | amper Сила тока A (А) 71 | power Мощность P (кВт) 72 | volt Напряжение U (В) 73 | batvolt Напряжение батареи 74 | serialnum Серийный номер счетчика 75 | version Дата версии ПО 76 | datetime Дата время по счетчику 77 | datemake Дата изготовления 78 | last_on Время последнего включения 79 | last_off Время последнего выключения -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/electro_counter.conf: -------------------------------------------------------------------------------- 1 | # 2 | # Data read from electric meter 3 | # electro_counter.conf configuration 4 | # 5 | # 2016-04-18 - 2016-05-16 version 2 6 | # 2017-04-26 version 2.1 7 | # 2018-01-29 version 2.2 8 | # 9 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 10 | # 11 | # version 2.2 12 | # 13 | # DONATE Поблагодарить 14 | # Всем, кто считает проделанную работу полезной, 15 | # есть возможность поддержать автора. 16 | # Карта ПриватБанка: 6762 4626 8013 0082. 17 | # Всем заранее спасибо. 18 | # 19 | 20 | 21 | 22 | # файл протокола обмена со счетчиком 23 | COUNTER_TYPE="merc200.sh" 24 | # устройство-порт, к которому подключен счетчик 25 | DEVICE="/dev/ttyUSB0" 26 | # серийный номер счетчика 27 | COUNTER_SN=680870 28 | # пароль чтения 29 | PASS_READ=111111 30 | # пароль записи 31 | PASS_WRITE=12333333 32 | 33 | # AUTO, FREEBSD, LINUX 34 | OS=LINUX 35 | # режим отладки 0, 1, 2 36 | DEBUG=0 37 | # отображать описание команды или нет 38 | DISPLAY_DESCRIPTION=NO 39 | # временный файл 40 | TMPFL="/tmp/electro_counter.tmp" 41 | # режим эмуляции работы со счетчиком 42 | DEV_EMULATOR="NO" 43 | 44 | # 45 | ECHOCOMMAND=NO 46 | 47 | C_ECHO=/bin/echo 48 | #C_ECHO=echo 49 | 50 | # метод связи: DD, CAT 51 | METHOD_COMMUNITY="CAT" 52 | # жесткий контроль контрольной суммы(NO), контрольная сумма может полностью или частично отсутствовать(YES) 53 | FUZZY_MATCHING_CRC="YES" 54 | 55 | # ожидание 56 | WAIT_TIME=.050 57 | # сколько итераций по WAIT_TIME милисек ожидать ответа 58 | WAITTICK=10 59 | # тестировать ли связь перед каждым запросом 60 | TEST_COMMUNITY="YES" 61 | TEST_COMMAND=amper 62 | # кол-во попыток отправки запроса TEST 63 | TRY_COUNT_TEST=5 64 | # кол-во попыток отправки целевого запроса 65 | TRY_COUNT_COMMAND=3 66 | 67 | # параметры настройки определения запущенной копии скрипта 68 | # каталог расположения файла-флага 69 | PID_DIR="/tmp" 70 | # имя файла-флага 71 | PID_NAME="electro_counter" 72 | # время ожидания окончания работы запущенной копии скрипта (сек) 73 | PID_TIMEOUT=20 74 | # частота проверки окончания работы запущенной копии скрипта (сек) 75 | PID_TIMEWAIT=1 76 | 77 | # параметры порта 78 | 79 | DEV_BAND=9600 80 | 81 | # FreeBSD 82 | DEV_FLAGS=" ixany ignbrk opost cread cs8 -ixon -ixoff -parenb -parodd -hupcl -clocal -cstopb raw" 83 | #speed 9600 baud; 0 rows; 0 columns; 84 | #lflags: -icanon -isig -iexten -echo -echoe -echok echoke -echonl echoctl 85 | # -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo 86 | # -extproc 87 | #iflags: -istrip -icrnl -inlcr -igncr -ixon -ixoff ixany -imaxbel ignbrk 88 | # -brkint -inpck -ignpar -parmrk 89 | #oflags: opost -onlcr -ocrnl tab0 -onocr -onlret 90 | #cflags: cread cs8 -parenb -parodd -hupcl -clocal -cstopb -crtscts 91 | # -dsrflow -dtrflow -mdmbuf 92 | #cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ; 93 | # eol2 = ; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U; 94 | # lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q; 95 | # status = ^T; stop = ^S; susp = ^Z; time = 2; werase = ^W; 96 | 97 | # Linux 98 | #DEV_FLAGS_LINUX=" speed 9600 baud; rows 0; columns 0; line = 0; 99 | #intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; 100 | #-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts 101 | #-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 102 | #-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 103 | #-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke" 104 | 105 | #Linux Debian 106 | DEV_FLAGS_LINUX=" cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts" 107 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/electro_counter.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter 4 | # electro_counter.sh main 5 | # 2015-07-07 version 1 6 | # 2016-04-09 - 2016-05-16 version 2 7 | # 2017-04-26 version 2.1 8 | # 2018-01-29 version 2.2 9 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 10 | # 11 | # 12 | # version 2.2 13 | # 14 | # parameters: COMMAND COUNTER_SN COUNTER_CONFIG_FILE 15 | # COMMAND 16 | # COUNTER_SN - counter serial number 17 | # COUNTER_CONFIG_FILE - counter configuration file 18 | # 19 | # DONATE Поблагодарить 20 | # Всем, кто считает проделанную работу полезной, 21 | # есть возможность поддержать автора. 22 | # Карта ПриватБанка: 6762 4626 8013 0082. 23 | # Всем заранее спасибо. 24 | # 25 | 26 | #set -x 27 | 28 | canceled=1 29 | 30 | # каталог скрипта 31 | BASE_DIR="$(dirname "$0")/" 32 | 33 | . ${BASE_DIR}lib_funct.sh 34 | . ${BASE_DIR}electro_counter.conf 35 | 36 | # $1 - command 37 | # $2 - COUNTER_SN 38 | # $3 - COUNTER_TYPE 39 | 40 | Fatalerror() 41 | { 42 | [ "$1" != 'bash' ] && exit ${2} 43 | } 44 | 45 | SetDeviceParams() 46 | { 47 | if [ $OS = 'FREEBSD' ]; then 48 | stty -f ${DEVICE}.init $DEV_BAND $DEV_FLAGS 49 | return $? 50 | else 51 | stty -F ${DEVICE} $DEV_FLAGS_LINUX 52 | return $? 53 | fi 54 | } 55 | 56 | 57 | reciver() 58 | { 59 | cm=${1} 60 | lenc=${2} 61 | 62 | len="${MIN_BLOCK_SIZE},$lenc" 63 | 64 | #echo "cm=$cm lenc=$lenc len=$len" >&2 65 | 66 | cm_len=0 67 | [ "${ECHOCOMMAND}" = "YES" ] && { 68 | cm_len=`expr ${#cm} \/ 5` 69 | lenc=`expr $cm_len + $lenc` 70 | } 71 | 72 | case ${METHOD_COMMUNITY} in 73 | "DD") . ${BASE_DIR}getinfo_var_1.sh "${cm}" ${lenc} ;; 74 | "CAT"|*) . ${BASE_DIR}getinfo_var_2.sh "${cm}" ${lenc} ;; 75 | esac 76 | 77 | #echo -n "0" >> "${TMPFL}" 78 | #echo "$anw" > 2 79 | filesi=`GetFileSize "${TMPFL}"` 80 | 81 | #echo "${tmpfl} $filesi $len" >&2 82 | 83 | if [ $filesi -ne 0 ]; then 84 | anw="`hexdump -ve '1/1 "x%.2X"' "${TMPFL}"`" 85 | #anw="`echo "${anw}" | hexdump -ve '1/1 "x%.2X"'`" 86 | [ $cm_len -gt 0 ] && { 87 | ech_len=`expr $cm_len \* 3` 88 | anw_start=`expr $ech_len + 1` 89 | anw_len=${#anw} 90 | ech=`echo $anw | cut -c1-${ech_len}` 91 | anw=`echo $anw | cut -c${anw_start}-${anw_len}` 92 | 93 | filesi=`expr $filesi - $cm_len` 94 | echo "ech=$ech anw=$anw filesi=$filesi len=$len" >&2 95 | } 96 | else 97 | anw='' 98 | fi 99 | 100 | echo "$anw $filesi" 101 | 102 | #echo "anw=$anw filesi=$filesi len=$len" >&2 103 | 104 | if [ -n "`echo $len | grep -E '(^|,)'${filesi}'(,|$)'`" ]; then 105 | return 0 106 | else 107 | if [ $filesi -eq 0 ]; then 108 | return 1 109 | else 110 | case `expr $lenc - $filesi` in 111 | 1) return 3 ;; 112 | 2) return 4 ;; 113 | *) return 2 ;; 114 | esac 115 | #return 2 116 | fi 117 | fi 118 | } 119 | 120 | test_reciver() 121 | { 122 | good=1 123 | local answer 124 | local result 125 | for i in `GetSequence ${TRY_COUNT_TEST}` 126 | do 127 | answer="`reciver ${1} ${2}`" 128 | result=$? 129 | # sleep .080 > /dev/null 2>&1 130 | [ $DEBUG -gt 0 ] && echo "TEST_ANSWER($i) "$answer 131 | [ $result -eq 0 ] && { 132 | good=0 133 | break 134 | } 135 | #[ $DEBUG -gt 0 ] && echo $answer 136 | done 137 | 138 | return $good 139 | } 140 | 141 | 142 | trap_x() 143 | { 144 | case "$1" in 145 | 0) ;; #echo_ex "Normal end ${BASE_NAME}." ;; 146 | 2) echo "Abort(Ctrl+C) ${BASE_NAME}!" ;; 147 | *) echo "Trap code(${1}) unknown ${BASE_NAME}!" ;; 148 | esac 149 | 150 | if [ $canceled -eq 0 ] && [ -f "${PID_DIR}/${PID_NAME}.pid" ]; then 151 | rm -f "${PID_DIR}/${PID_NAME}.pid" 152 | fi 153 | rm "${TMPPID}" 154 | 155 | case "$1" in 156 | 0) ;; 157 | 2) exit 254 ;; 158 | *) exit 253 ;; 159 | esac 160 | } 161 | 162 | 163 | trap "trap_x 0" 0 164 | trap "trap_x 2" 2 165 | 166 | 167 | # define COUNTER_CONFIG_FILE 168 | [ -n "${3}" ] && { 169 | COUNTER_CONFIG_FILE="${3}" 170 | if [ -r "${COUNTER_CONFIG_FILE}" ]; then 171 | . "${COUNTER_CONFIG_FILE}" 172 | else 173 | echo "Error! Not exists configuration file \"${COUNTER_CONFIG_FILE}\"!" 174 | Fatalerror "$0" 1 175 | #return 1 176 | fi 177 | } 178 | 179 | 180 | # define COUNTER_TYPE 181 | #[ -n "${3}" ] && COUNTER_TYPE=${3} 182 | [ -z "${COUNTER_TYPE}" ] && { 183 | echo "Error! Not defind COUNTER TYPE!" 184 | Fatalerror "$0" 1 185 | return 1 186 | } 187 | if [ -r "${BASE_DIR}${COUNTER_TYPE}" ]; then 188 | . ${BASE_DIR}${COUNTER_TYPE} 189 | else 190 | echo "Error! Not found file for COUNTER TYPE \"${COUNTER_TYPE}\"!" 191 | Fatalerror "$0" 2 192 | return 2 193 | fi 194 | [ -z "${DEVICE}" ] && { 195 | echo "Error! Not define device!" 196 | Fatalerror "$0" 3 197 | return 3 198 | } 199 | [ -r "${DEVICE}" ] || { 200 | echo "Error! Not exists device \"${DEVICE}\"!" 201 | Fatalerror "$0" 4 202 | return 4 203 | } 204 | 205 | 206 | # define OS if auto 207 | [ "${OS}" = "FREEBSD" -o "${OS}" = "LINUX" ] || OS=`uname | tr "[a-z]" "[A-Z]"` 208 | 209 | 210 | # исключить одновременную работу двух и более копий скрипта для одного и того же порта(DEVICE) 211 | PID_NAME="${PID_NAME}`echo "${DEVICE}" | tr -s "/" "-"`" 212 | #echo ${PID_NAME} >&2 213 | # 214 | # PID_TIMEOUT 215 | # PID_DIR 216 | # PID_NAME 217 | # PID_TIMEWAIT 218 | TMPPID="${PID_DIR}/${PID_NAME}.$$" 219 | echo $$ > "${TMPPID}" 220 | timeout=0 221 | while [ $timeout -lt ${PID_TIMEOUT} ] 222 | do 223 | ln -s "${TMPPID}" "${PID_DIR}/${PID_NAME}.pid" 2> /dev/null 224 | [ $? -eq 0 ] && { 225 | canceled=0 226 | break 227 | } 228 | PID="`cat "${PID_DIR}/${PID_NAME}.pid"`" 229 | if ! kill -0 $PID 2>/dev/null; then 230 | rm -f "${PID_DIR}/${PID_NAME}.pid" 231 | fi 232 | timeout=$((timeout + ${PID_TIMEWAIT})) 233 | sleep ${PID_TIMEWAIT} 234 | done 235 | [ $canceled -ne 0 ] && { 236 | echo "Timeout ${PID_TIMEOUT} sec has expired." 237 | exit 1 238 | } 239 | 240 | 241 | # define COUNTER_SN 242 | [ -n "${2}" ] && COUNTER_SN=${2} 243 | SetCounterSN 244 | 245 | 246 | [ $DEBUG -gt 0 ] && echo "OS: ${OS}; DEVICE: ${DEVICE}; COUNTER_SN: ${COUNTER_SN}($CSN); COUNTER_TYPE: ${COUNTER_TYPE}; ECHOCOMMAND: ${ECHOCOMMAND}; TEST_COMMUNITY: ${TEST_COMMUNITY}; DEV_EMULATOR: ${DEV_EMULATOR}; METHOD_COMMUNITY: ${METHOD_COMMUNITY}; FUZZY_MATCHING_CRC: ${FUZZY_MATCHING_CRC}" 247 | 248 | 249 | # define COMMAND 250 | # SetParams "${1}" > /dev/null 251 | # [ "$?" -ne 0 ] && { 252 | # echo "Error SetParams" 253 | # Fatalerror "$0" 7 254 | # return 7 255 | # } 256 | 257 | 258 | # тестирование связи, настройка параметров порта при необходимости 259 | # COMMAND TEST 260 | [ ${TEST_COMMUNITY} = "YES" ] && { 261 | CheckParameter "command" "${TEST_COMMAND}" "${COMMANDS}" "" "Command \"${TEST_COMMAND}\" not found!" > /dev/null 262 | CMDTESTEXIST=$? 263 | } 264 | [ ${TEST_COMMUNITY} = "YES" -a 0${CMDTESTEXIST} -eq 0 ] && { 265 | 266 | # comtest="`GetCommandLine ${CSN} ${TEST_COMMAND}`" 267 | 268 | SetParams "${TEST_COMMAND}" > /dev/null 269 | [ "$?" -ne 0 ] && { 270 | echo "Error SetParams" 271 | Fatalerror "$0" 7 272 | return 7 273 | } 274 | 275 | [ ${DEBUG} -gt 0 ] && echo "TEST_SEND: ${TEST_COMMAND} ${cmd} ${com_size}" 276 | 277 | crc=1 278 | answ="`test_reciver ${cmd} ${com_size}`" 279 | #answ="`reciver ${cmd} ${com_size}`" 280 | result=$? 281 | [ $DEBUG -gt 0 ] && echo "${answ}" 282 | [ $result -eq 1 ] && { 283 | if [ ${DEV_EMULATOR} = "NO" ]; then 284 | [ $DEBUG -gt 0 ] && echo "Set params device \"${DEVICE}\"..." 285 | SetDeviceParams 286 | retset=$? 287 | [ $DEBUG -gt 0 ] && echo "Set params device \"${DEVICE}\" - $retset." 288 | if [ $retset -eq 0 ]; then 289 | answ="`test_reciver ${cmd} ${com_size}`" 290 | result=$? 291 | [ $DEBUG -gt 0 ] && echo "$answ" 292 | [ $result -eq 1 ] && { 293 | echo "Error! Not answer \"${DEVICE}\"!"; 294 | Fatalerror "$0" 7 295 | return 7 296 | } 297 | else 298 | echo "Error! Set params device \"${DEVICE}\"!"; 299 | Fatalerror "$0" 6 300 | return 6 301 | fi 302 | else 303 | echo "Error! Not answer \"${DEVICE}\"!"; 304 | Fatalerror "$0" 7 305 | return 7 306 | fi 307 | } 308 | } 309 | 310 | # define COMMAND 311 | SetParams "${1}" > /dev/null 312 | [ "$?" -ne 0 ] && { 313 | echo "Error SetParams" 314 | Fatalerror "$0" 7 315 | return 7 316 | } 317 | 318 | #set -x 319 | # COMMAND PROCESSING 320 | [ $DEBUG -gt 0 ] && echo "SEND: "${cmd} 321 | crc=1 322 | for i in `GetSequence ${TRY_COUNT_COMMAND}` 323 | do 324 | answer="`reciver ${cmd} ${com_size}`" 325 | recret=$? 326 | [ $DEBUG -gt 0 ] && echo "ANSWER($i): "$answer $recret 327 | 328 | ans=`echo "$answer" | cut -d" " -f1` 329 | len_ans=`echo "$answer" | cut -d" " -f2` 330 | #echo $ans $len_ans 331 | 332 | [ "${FUZZY_MATCHING_CRC}" = "YES" ] && { 333 | case $recret in 334 | 3) ans1=$(form_com `echo $ans | sed 's/.\{3\}$//'` 'x' 'x%s') 335 | [ -n "`echo $ans1 | grep '^'${ans}'...$'`" ] && ans=$ans1 336 | ;; 337 | 4) ans=$(form_com $ans 'x' 'x%s') ;; 338 | esac 339 | case $recret in 340 | 3|4) len_ans=$com_size 341 | recret=0 342 | ;; 343 | esac 344 | [ $DEBUG -gt 0 ] && echo $ans $len_ans $recret 345 | } 346 | 347 | dyn_mode=0 348 | [ $recret -ne 1 -a ${com_size} -eq ${MAX_BLOCK_SIZE} ] && dyn_mode=1 349 | 350 | [ $recret -eq 0 -o $dyn_mode -eq 1 ] && { 351 | check_com $ans 352 | crc=$? 353 | [ $crc -eq 0 ] && { 354 | [ $len_ans -eq $MIN_BLOCK_SIZE ] && { 355 | need="`Parser_com $com_name $ans $len_ans | sed -n 's/.* Need \(.*\)/\1/p'`" 356 | [ -n "$need" ] && { 357 | answer="`reciver $(GetCommandLine "$CSN" "$need")`" 358 | continue 359 | } 360 | } 361 | break 362 | } 363 | } 364 | done 365 | #set +x 366 | 367 | # COMMAND RESULT PARSING 368 | if [ $recret -eq 0 -o $dyn_mode -eq 1 ]; then 369 | if [ $crc -eq 0 ]; then 370 | [ ${DISPLAY_DESCRIPTION} = 'YES' ] && echo "$name" 371 | Parser_com $com_name $ans $len_ans $outparser 372 | else 373 | echo "Error CRC!" 374 | Fatalerror "$0" 10 375 | fi 376 | else 377 | if [ $recret -eq 1 ]; then 378 | echo "Error! Counter(${COUNTER_SN}) not answer!" 379 | Fatalerror "$0" 11 380 | else 381 | echo "Error! Size packets(${len_ans}) error!" 382 | Fatalerror "$0" 12 383 | fi 384 | fi 385 | 386 | 387 | #sleep 5 388 | exit 255 389 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/electro_counter200.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # For yuoras, yuoras@meta.ua ICQ: 377599750 4 | # electro_counter200.sh 5 | # 2017-05-15 version 1 6 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 7 | # 8 | # 9 | # version 1 10 | # 11 | 12 | #main_path="/opt/root/200" 13 | main_path="." 14 | c_mysql=/opt/bin/mysql 15 | DB_HOST=192.168.100.15 16 | DB_USER=merk 17 | DB_PASS= 18 | DB_BASE=merkury 19 | 20 | 21 | #query="insert into mer200(date, t1, t2, t3, t4, summa, volt, power, prim) values (now(), T1, T2, T3, T4, SUMMA, VOLT, POWER, PRIM)" 22 | query="insert into mer200(date, t1, t2, t3, t4, summa, volt, power) values (now(), T1, T2, T3, T4, SUMMA, VOLT, POWER)" 23 | 24 | elsum=`sh $main_path/electro_counter.sh kwatt_summ2 | grep -Ei ^[a-z,0-9]{1,8}=[0-9,\.]{1,}$` 25 | 26 | eval $elsum 27 | 28 | power=`sh $main_path/electro_counter.sh avp | grep -Ei ^[a-z,0-9]{1,8}=[0-9,\.]{1,}$` 29 | 30 | eval $power 31 | 32 | #Last_on=`$main_path/electro_counter.sh last_on` 33 | 34 | #eval $Last_on 35 | 36 | #f_sql_scr="`echo $query | sed 's/T1/'$T1'/; s/T2/'$T2'/; s/T3/'$T3'/; s/T4/'$T4'/; s/SUMMA/'$SUM'/; s/VOLT/'$VOLT'/; s/POWER/'$WATT'/; s 37 | f_sql_scr="`echo $query | sed 's/T1/'$T1'/; s/T2/'$T2'/; s/T3/'$T3'/; s/T4/'$T4'/; s/SUMMA/'$SUM'/; s/VOLT/'$VOLT'/; s/POWER/'$WATT'/'`" 38 | 39 | $c_mysql -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_BASE -vv -e "${f_sql_scr};" 40 | 41 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/electro_counter230.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # For yuoras, yuoras@meta.ua ICQ: 377599750 4 | # electro_counter230.sh 5 | # 2017-04-26 version 1 6 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 7 | # 8 | # 9 | # version 1 10 | # 11 | 12 | all="`/bin/sh ./electro_counter.sh kwatthour:all_time:T_ALL`" 13 | T1="`sh ./electro_counter.sh kwatthour:all_time:T1`" 14 | T2="`sh ./electro_counter.sh kwatthour:all_time:T2`" 15 | T3="`sh ./electro_counter.sh kwatthour:all_time:T3`" 16 | T4="`sh ./electro_counter.sh kwatthour:all_time:T4`" 17 | 18 | n=1 19 | for i in 1 2 3 4 20 | do 21 | for j in 0 1 2 3 4 22 | do 23 | if [ $j -eq 0 ]; then 24 | sn="SM" 25 | sm="$all" 26 | else 27 | sn=T$j 28 | eval sm="\$$sn" 29 | fi 30 | echo "$sm" | sed -n $n'{; s/\([AR]\)p/\1+/; s/\([AR]\)o/\1-/; s/\(..\)([^)]*) = \(.*\)/'$sn' \1 = \2/p; }' 31 | done 32 | [ $i -eq 4 ] || { 33 | echo 34 | n=`expr $n + 1` 35 | } 36 | done -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/getinfo_var_1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter through dd 4 | # 2016-04-18 5 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 6 | # 7 | # 8 | # version 1 9 | # 10 | # DONATE Поблагодарить 11 | # Всем, кто считает проделанную работу полезной, 12 | # есть возможность поддержать автора. 13 | # Карта ПриватБанка: 6762 4626 8013 0082. 14 | # Всем заранее спасибо. 15 | # 16 | 17 | 18 | BASE_DIR="$(dirname "$0")/" 19 | #. ${BASE_DIR}lib_funct.sh 20 | 21 | cm=${1} 22 | lenc=${2} 23 | 24 | trap_x() 25 | { 26 | case "$1" in 27 | 0) ;; #echo_ex "Normal end ${BASE_NAME}." ;; 28 | 2) ;; #echo "Abort(Ctrl+C) ${BASE_NAME}!" ;; 29 | *) ;; #echo "Trap code(${1}) unknown ${BASE_NAME}!" ;; 30 | esac 31 | 32 | if kill -0 ${outport} 2>/dev/null; then 33 | #echo "Need Kill $outport" >&2 34 | kill $outport 35 | wait ${outport} >/dev/null 2>&1 36 | fi 37 | 38 | if kill -0 ${inport} 2>/dev/null; then 39 | kill $inport 40 | wait ${inport} >/dev/null 2>&1 41 | fi 42 | 43 | return 10 44 | } 45 | 46 | trap "trap_x 0" 0 47 | trap "trap_x 2" 2 48 | 49 | 50 | 51 | [ $DEBUG -gt 1 ] && echo "METHOD_COMMUNITY=DD len=$lenc" >&2 52 | 53 | inport=0 54 | outport=0 55 | 56 | # [ "${ECHOCOMMAND}" = "YES" ] && { 57 | # cm_len=`expr ${#cm} \/ 5` 58 | # lenc=`expr $cm_len + $cm_len` 59 | # } 60 | 61 | len_block=$lenc 62 | #len_block=`echo $len | rev | cut -d"," -f1 | rev` 63 | 64 | HexToChar "${cm}" > ${DEVICE} & 65 | [ -z "$!" ] || inport=$! 66 | ( dd if=${DEVICE} of="${TMPFL}" count=$len_block obs=1 ibs=1 > /dev/null 2>&1 ) & 67 | [ -z "$!" ] || outport=$! 68 | 69 | [ "${DEV_EMULATOR}" = "YES" ] && Dev_Enulator "${cm}" "${TMPFL}" 70 | 71 | ii=0 72 | while kill -0 ${outport} 2>/dev/null 73 | do 74 | ii=`expr $ii + 1` 75 | [ $ii -gt ${WAITTICK} ] && break 76 | SleepEx ${WAIT_TIME} 77 | # sleep .050 > /dev/null 2>&1 78 | # [ $? -eq 0 ] || ping -c2 -i.050 127.0.0.1 >/dev/null 2>&1 79 | done 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/getinfo_var_2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter through cat 4 | # 2016-04-18 5 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 6 | # 7 | # 8 | # version 1 9 | # 10 | # DONATE Поблагодарить 11 | # Всем, кто считает проделанную работу полезной, 12 | # есть возможность поддержать автора. 13 | # Карта ПриватБанка: 6762 4626 8013 0082. 14 | # Всем заранее спасибо. 15 | # 16 | 17 | 18 | 19 | # каталог скрипта 20 | BASE_DIR="$(dirname "$0")/" 21 | BASE_NAME="$(basename "$0")" 22 | 23 | #. ${BASE_DIR}lib_funct.sh 24 | 25 | trap_x() 26 | { 27 | case "$1" in 28 | 0) ;; #echo_ex "Normal end ${BASE_NAME}." ;; 29 | 2) ;; #echo "Abort(Ctrl+C) ${BASE_NAME}!" ;; 30 | *) ;; #echo "Trap code(${1}) unknown ${BASE_NAME}!" ;; 31 | esac 32 | 33 | if kill -0 ${outport} 2>/dev/null; then 34 | kill ${outport} 35 | wait ${outport} >/dev/null 2>&1 36 | fi 37 | return 10 38 | } 39 | 40 | trap "trap_x 0" 0 41 | trap "trap_x 2" 2 42 | 43 | cm=${1} 44 | lenc=${2} 45 | 46 | # [ "${ECHOCOMMAND}" = "YES" ] && { 47 | # cm_len=`expr ${#cm} \/ 5` 48 | # lenc=`expr $cm_len + $cm_len` 49 | # } 50 | 51 | [ $DEBUG -gt 1 ] && echo "METHOD_COMMUNITY=CAT len=$lenc" >&2 52 | 53 | cat ${DEVICE} > "${TMPFL}" & 54 | [ -z "$!" ] || outport=$! 55 | 56 | HexToChar "${cm}" > ${DEVICE} 57 | 58 | #HexToChar "${cm}" > tesst 59 | 60 | [ "${DEV_EMULATOR}" = "YES" ] && Dev_Enulator "${cm}" "${TMPFL}" 61 | 62 | #set -x 63 | ii=0 64 | while [ `GetFileSize "${TMPFL}"` -lt $lenc ] 65 | do 66 | ii=$(($ii + 1)) 67 | [ $ii -gt ${WAITTICK} ] && break 68 | SleepEx ${WAIT_TIME} 69 | # sleep .050 > /dev/null 2>&1 70 | # [ $? -eq 0 ] || ping -c2 -i.050 127.0.0.1 >/dev/null 2>&1 71 | done 72 | #set +x 73 | 74 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/lib_funct.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter 4 | # lib_funct.sh Function libriary 5 | # 2015-07-07 v 1 6 | # 2016-04-18 v 2 7 | # 2017-04-26 version 2.1 8 | # 2018-01-29 version 2.2 9 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 10 | # 11 | # 12 | # version 2.2 13 | # 14 | # DONATE Поблагодарить 15 | # Всем, кто считает проделанную работу полезной, 16 | # есть возможность поддержать автора. 17 | # Карта ПриватБанка: 6762 4626 8013 0082. 18 | # Всем заранее спасибо. 19 | # 20 | 21 | SleepEx() 22 | { 23 | sleep $1 > /dev/null 2>&1 24 | [ $? -eq 0 ] || ping -c2 -i$1 127.0.0.1 >/dev/null 2>&1 25 | } 26 | 27 | GetFileSize() 28 | { 29 | case $OS in 30 | 'FREEBSD') stat -f%z "${1}" ;; 31 | *) ls -l "${1}" | awk '{print $5}' ;; 32 | esac 33 | } 34 | 35 | # calculate CRC CRC_Modbus 36 | CRC_Modbus() 37 | { 38 | local string=$(echo ${1} | sed 's/_0x//g;s/[_x#]//g') 39 | local mode=${2} 40 | local mode=${mode:=1} 41 | local pref=${3} 42 | 43 | # вычисляем длину string 44 | cnt=${#string} 45 | crc=0xFFFF 46 | 47 | all=`expr $cnt - 2` 48 | if [ $OS = 'FREEBSD' ]; then 49 | kol=`expr $cnt / 2` 50 | masD="`jot $kol 0 $all`" 51 | masB="`jot 8 0 7`" 52 | else 53 | masD="`seq 0 2 $all`" 54 | masB="`seq 0 7`" 55 | fi 56 | 57 | for i in $masD 58 | do 59 | # --- FOR SH BEGIN ---- 60 | cut_i=$(($i + 1)) 61 | koli=$(($cut_i + 1)) 62 | bob="`echo "$string" | cut -c${cut_i}-${koli}`" 63 | # echo "i=$i cut_i=$cut_i koli=$koli bob=$bob" >&2 64 | crc=$(( crc ^ $((0x${bob})) )) # ^ - по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) 65 | # --- FOR SH END ---- 66 | 67 | # --- FOR BASH BEGIN ---- 68 | #crc=$(( crc ^ $((0x${string:$i:2})) )) # ^ - по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) 69 | # --- FOR BASH END ---- 70 | 71 | for j in $masB 72 | do 73 | c=$(( crc & 1 )) # & - по-битовое И (AND) 74 | crc=$(( crc >> 1 )) # >> - сдвиг вправо на 1 бит (деление на 2) 75 | [ $c -eq 1 ] && crc=$(( crc ^ 0xA001 )) # ^ - по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) 76 | done 77 | 78 | # echo "$i 0x${string:$i:2} $crc" 79 | done 80 | 81 | if [ $mode -eq 1 ]; then 82 | crcc=`printf "%04X" "$crc"` 83 | # printf "${pref}${pref}" "${crcc:2:2}" "${crcc:0:2}" FOR BASH 84 | printf "${pref}${pref}" "`echo ${crcc} | cut -c3-4`" "`echo ${crcc} | cut -c1-2`" # FOR SH 85 | else 86 | printf "${pref}" "$crc" 87 | fi 88 | 89 | return 0 90 | } 91 | 92 | 93 | HexToChar() 94 | { 95 | case $OS in 96 | 'FREEBSD') echo -n "${1}" | awk -F'_' '{for(i=1; i<=NF; i++) {printf "%c", $i}}' ;; 97 | *) #echo ${1} | sed 's/_0x/\\\x/g' >&2 98 | # ONLY BASH ! 99 | $C_ECHO -en "`echo ${1} | sed 's/_0x/\\\x/g'`" 100 | ;; 101 | esac 102 | } 103 | 104 | StrToHex() 105 | { 106 | echo "${1}" | awk '{len=length($0); for(i=1; i<=len; i++) {printf "x%02x", substr($0,i,1)}}' 107 | } 108 | 109 | GetSequence() 110 | { 111 | case $OS in 112 | 'FREEBSD') jot ${1} ;; 113 | *) seq 1 ${1} ;; 114 | esac 115 | } 116 | 117 | 118 | GetCommandLine() 119 | { 120 | tempCSN=$CSN 121 | CSN=$1 122 | tcom=$2 123 | #echo "\"$1\" \"$tcom\"" >&2 124 | tcom=${tcom:='test'} 125 | 126 | tcom="`echo "${COMMANDS}" | grep "^${tcom} "`" 127 | 128 | _cmd="`echo "${tcom}" | cut -d" " -f2`" 129 | _com_size="`echo "${tcom}" | cut -d" " -f3`" 130 | eval _cmd=${_cmd} 131 | eval _com_size=${_com_size} 132 | CSN=$tempCSN 133 | 134 | echo "${_cmd} ${_com_size}" 135 | } 136 | 137 | form_com() 138 | { 139 | pref=${2} 140 | pref=${pref:='_0x'} 141 | pref2=${3} 142 | pref2=${pref2:='_0x%02s'} 143 | 144 | #echo "$pref" >&2 145 | cmd=`echo -n ${1} | sed 's/[x#]/'$pref'/g'` 146 | echo -n ${cmd}`CRC_Modbus ${cmd} 1 "${pref2}"` 147 | } 148 | 149 | 150 | check_com() 151 | { 152 | anwo=$(form_com `echo $1 | sed 's/.\{6\}$//'` 'x' 'x%s') 153 | #echo "$anw $anwo" 154 | [ "$1" = "$anwo" ] && return 0 155 | return 1 156 | } 157 | 158 | 159 | ParserCommand() 160 | { 161 | block=$1 162 | nblock="$2" 163 | 164 | # echo "PC $1 "$nblock" $3" >&2 165 | 166 | if [ 0"$3" -eq 0 ]; then 167 | # единичное значение 168 | 169 | if [ -n "`echo $nblock | grep "^[0-9][0-9]*$"`" ]; then 170 | cio="`$C_ECHO -n $1 | awk -Fx -v num=$nblock -v stp=${START_BLOCK_DATA} '{print x$(num+stp)}'`" 171 | else 172 | cio=`echo $nblock | sed -n 's~^\(.*[dx]\)\(.*\)~echo "'$1'" | awk -Fx -v stp=${START_BLOCK_DATA} \\\{printf\\\(\\\"%\1\\\",\\\"0x\\\"\\\$\\\(\2+stp\\\)\\\)\\\}~p'` 173 | fi 174 | else 175 | # блочное значение 176 | cio="`$C_ECHO "$nblock" | sed -n 's/\\\0/ /g; s/\(.*\)\\\t\(.*\)/\1'"$1"'\2/p'`" 177 | [ -n "$cio" ] && { 178 | echo "${cio}" 179 | return 0 180 | } 181 | #echo "c0" >&2 182 | 183 | nblock=`echo "$nblock" | sed 's~\^b~\$~g; s~\^0~ ~g'` 184 | 185 | if [ "`echo "${nblock}" | cut -c1`" = "A" ]; then 186 | nblock="`$C_ECHO $nblock | sed 's~^A\(.*\)~{\1}~'`" 187 | #echo "1mnog=\"$mnog\" nblock=\"$nblock\" block=$block" >&2 188 | 189 | cio="`$C_ECHO "${block}" | awk ${nblock}`" 190 | 191 | #echo "2mnog=\"$mnog\" nblock=\"$nblock\" block=$block" >&2 192 | else 193 | mnog="`$C_ECHO $nblock | sed -n 's/.*\.\(.*\)f.*/\1/p'`" 194 | #echo "mnog=\"$mnog\" nblock=\"$nblock\" block=$block" >&2 195 | 196 | if [ -n "$mnog" ]; then 197 | cio=`$C_ECHO $1 | awk '{printf("%'$nblock'", $0 / (10 ** '$mnog'))}'` 198 | else 199 | if [ "$nblock" = "$2" ]; then 200 | cio=`$C_ECHO "$nblock" | sed -n 's/^a\(.*\)/\$(( '$1' \& 0x\1 ))/p'` 201 | #echo "c0=\"$mnog\" bio=\"$bio\" block=$block" >&2 202 | [ -z "$cio" ] && cio=`$C_ECHO $nblock | printf "%$nblock" 0x${1}` 203 | else 204 | cio=$nblock 205 | fi 206 | fi 207 | fi 208 | fi 209 | #echo "cio=$cio" >&2 210 | #echo cio="$cio" >&2 211 | eval echo "$cio" 212 | } 213 | 214 | 215 | CheckParameter() 216 | { 217 | par_name="${1}" 218 | par_val="${2}" 219 | par_list="${3}" 220 | par_def="${4}" 221 | par_flag="${5}" 222 | 223 | #echo "par_name \"${par_name}\" par_val=\"${par_val}\" par_list=\"${par_list}\" par_def=\"$par_def\" par_flag=\"$par_flag\"" >&2 224 | retur=0 225 | 226 | par_cor="${par_def}" 227 | if [ -n "${par_val}" ]; then 228 | par_cor="`$C_ECHO "${par_list}" | sed -n 's/^'${par_val}' [ ]*\(.*\)$/\1/p'`" 229 | #echo $par_cor >&2 230 | [ -z "${par_cor}" ] && { 231 | par_cor="$par_def" 232 | if [ -z "${par_flag}" ]; then 233 | echo "Parameter value \"${par_name}\"=\"${par_val}\" unknown! Set default \"${par_name}\"=\"${par_cor}\"" >&2 234 | retur=1 235 | else 236 | echo "${par_flag}" >&2 237 | retur=1 238 | fi 239 | } 240 | fi 241 | $C_ECHO "${par_cor}" 242 | return $retur 243 | } 244 | 245 | 246 | DoOutParser() 247 | { 248 | outpars="${1}" 249 | #echo $outpars >&2 250 | 251 | for bl in `$C_ECHO "${outpars}" | tr "|" " "` 252 | do 253 | ii=0 254 | #echo bl=$bl >&2 255 | for dv in `$C_ECHO "$bl" | tr '#' " "` 256 | do 257 | #echo dv="$dv" >&2 258 | [ $dv = '0' ] && { 259 | echo -n "$block" 260 | block='' 261 | ii=0 262 | continue 263 | } 264 | [ $ii -eq 1 ] && { 265 | block=`ParserCommand "$block" "$dv" 1` 266 | #ii=0 267 | continue 268 | } 269 | # echo "${block}" 270 | ii=1 271 | block='' 272 | for zp in `echo "$dv" | tr "," " "` 273 | do 274 | #echo zp=$zp >&2 275 | block=${block}`ParserCommand "$data" "$zp" 0` 276 | #echo block=$block >&2 277 | #echo "$block" 278 | done 279 | done 280 | echo "${block}" 281 | done 282 | } 283 | 284 | 285 | ParseNullCom() 286 | { 287 | local com_string="${1}" 288 | OutParser="" 289 | mode="`echo ${com_string} | cut -d":" -f2-`" 290 | if [ "$mode" != "$com_name" ]; then 291 | [ -z "$mode" ] && mode="x00" 292 | #echo mode=$mode Formats=$Formats >&2 293 | OutParser=`echo "${mode}" | sed -n 's/^[^=]*=\(.*\)$/\1/p'` 294 | if [ -n "${OutParser}" ]; then 295 | mode=`echo "${mode}" | cut -d"=" -f1` 296 | else 297 | OutParser=""; 298 | fi 299 | else 300 | mode="x00" 301 | fi 302 | } 303 | 304 | 305 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/merc200.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter 4 | # Merciry 200 5 | # 6 | # 2016-05-15 version 1 7 | # 2017-04-26 version 2.1 8 | # 2018-01-29 version 2.9 9 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 10 | # 11 | # 12 | # version 2.2 13 | # 14 | # DONATE Поблагодарить 15 | # Всем, кто считает проделанную работу полезной, 16 | # есть возможность поддержать автора. 17 | # Карта ПриватБанка: 6762 4626 8013 0082. 18 | # Всем заранее спасибо. 19 | # 20 | 21 | 22 | 23 | RETRY_QUERY=1 24 | MIN_BLOCK_SIZE=4 25 | MAX_BLOCK_SIZE=255 26 | START_BLOCK_DATA=5 27 | 28 | PASS_R=`StrToHex "${PASS_READ}"` 29 | PASS_W=`StrToHex "${PASS_WRITE}"` 30 | 31 | # modes list 32 | MODES='all_time 0 33 | curr_year 1 34 | prior_year 2 35 | month 3 36 | today 4 37 | yesterday 5 38 | all_time_phase 6' 39 | 40 | # tarifs list 41 | ZONES='T1 01 42 | T2 02 43 | T3 03 44 | T4 04' 45 | 46 | 47 | 48 | # commands list 49 | # alias command size answer parser format description 50 | COMMANDS='test `form_com x00${CSN}x00` 4 Тестирование связи 51 | #close `form_com x00${CSN}x02` 4 Завершение сеанса 52 | 53 | kwatthour `form_com x00${CSN}x27` 23 "02x$((${zona} * 4 - 3)),02x$((${zona} * 4 - 2)),02x$((${zona} * 4 - 1)),02x$((${zona} * 4))#Aprintf(\"%0.2f\",^b0/100)" Опрос накопленной энергии 54 | kwatthour_all `form_com x00${CSN}x27` 23 "02x1,02x2,02x3,02x4#Aprintf(\"%0.2f\",^b0/100)|02x5,02x6,02x7,02x8#Aprintf(\"%0.2f\",^b0/100)|02x9,02x10,02x11,02x12#Aprintf(\"%0.2f\",^b0/100)|02x13,02x14,02x15,02x16#Aprintf(\"%0.2f\",^b0/100)" Опрос накопленной энергии 55 | kwatt_summ `form_com x00${CSN}x27` 23 test 56 | kwatt_summ2 `form_com x00${CSN}x27` 23 Опрос накопленной энергии c выведением информации 57 | kwatt_month_summ `form_com x00${CSN}x32x0${month}` 23 test 58 | 59 | amper `form_com x00${CSN}x63` 14 "02x3,02x4#Aprintf(\"%s=%0.2f\",\"Amper\",^b0/100)" Сила тока A (А) 60 | power `form_com x00${CSN}x63` 14 "02x5,02x6,02x7#Aprintf(\"%s=%0.3f\",\"Power\",^b0/1000)" Мощность P (кВт) 61 | volt `form_com x00${CSN}x63` 14 "02x1,02x2#Aprintf(\"%s=%0.1f\",\"Volt\",^b0/10)" Напряжение U (В) 62 | avp `form_com x00${CSN}x63` 14 Сила тока A (А) Напряжение U (В) Мощность P (кВт) 63 | 64 | null `form_com x00${CSN}${mode}` ${MAX_BLOCK_SIZE} "${OutParser}" Произвольная команда 65 | 66 | batvolt `form_com x00${CSN}x29` ${MAX_BLOCK_SIZE} "2x1#Battery\\0=\\0\\t.#0#2#\\t\\0V" Напряжение батареи 67 | serialnum `form_com x00${CSN}x2f` ${MAX_BLOCK_SIZE} "1,2,3,4#d#Sn\\0=\\0\\t" Серийный номер счетчика 68 | version_date `form_com x00${CSN}x28` ${MAX_BLOCK_SIZE} "02x4#\\t.#0#02x5#\\t.#0#02x6" Дата версии ПО 69 | version `form_com x00${CSN}x28` ${MAX_BLOCK_SIZE} "1#version=\\t#0#2#.\\t" Версия ПО 70 | #datetime `form_com x00${CSN}x21` ${MAX_BLOCK_SIZE} "2#0#3#:\\t:#0#4#\\t\\0#0#5#\\t.#0#6#\\t.#0#7" Дата время по счетчику 71 | #datemake `form_com x00${CSN}x66` ${MAX_BLOCK_SIZE} "02x1#0#02x2#.\\t.#0#02x3" Дата изготовления 72 | #last_on `form_com x00${CSN}x2c` ${MAX_BLOCK_SIZE} "2#0#3#:\\t:#0#4#\\t\\0#0#5#\\t.#0#6#\\t.#0#7" Время последнего включения 73 | #last_off `form_com x00${CSN}x2b` ${MAX_BLOCK_SIZE} "2#0#3#:\\t:#0#4#\\t\\0#0#5#\\t.#0#6#\\t.#0#7" Время последнего выключения 74 | datetime `form_com x00${CSN}x21` ${MAX_BLOCK_SIZE} "5#datetime=\\t#0#6#.\\t.#0#7#\\t\\0#0#2#\\t:#0#3#\\t:#0#4" Дата время по счетчику 75 | datemake `form_com x00${CSN}x66` ${MAX_BLOCK_SIZE} "02x1#make=\\t#0#02x2#.\\t.#0#02x3" Дата изготовления 76 | last_on `form_com x00${CSN}x2c` ${MAX_BLOCK_SIZE} "5#On=\\t#0#6#.\\t.#0#7#\\t\\0#0#2#\\t:#0#3#\\t:#0#4" Время последнего включения 77 | last_off `form_com x00${CSN}x2b` ${MAX_BLOCK_SIZE} "5#Off=\\t#0#6#.\\t.#0#7#\\t\\0#0#2#\\t:#0#3#\\t:#0#4" Время последнего выключения' 78 | 79 | 80 | 81 | Dev_Enulator() 82 | { 83 | #_0x00_0x00_0x00_0x01_0x00_0x25_0x90 84 | local command="`echo "${1}" | cut -d"x" -f6 | cut -c1-2`" 85 | local answer="" 86 | 87 | case $command in 88 | # Мгновенные значения 89 | # 00 0E 1F CE 63 |03 67 90 | # 00 0E 1F CE 63 22 87 02 11 00 06 38 | - ответ : 228.7В, 2.11A, 638Вт 91 | '63') answer="`form_com x00${CSN}x${command}x22x87x01x50x00x06x38`" ;; 92 | # Дата время по счетчику 93 | # 00 0E 1F CE 21 | 94 | # 00 0E 1F CE 21 ?? ?? ?? ?? ?? | 95 | # -00 01 72 40 |21| 74 3F 00 01 72 40 21 01 19 08 27 27 03 17 |38 41 96 | '21') answer="`form_com x00${CSN}x${command}x01x11x24x06x18x04x11`" ;; 97 | # Показания счетчика 98 | # 00 0E 1F CE 27 |03 54 99 | # 00 0E 1F CE 27 00_00_04_16 00_00_01_70 00_00_00_00 00_00_00_00 |12 5B 100 | # 00000416 00000170 00000000 00000000 101 | # кВтч 4,16 (Т1); 1,70 (Т2); 0 (Т3); 0 (Т4) 102 | '27') answer="`form_com x00${CSN}x${command}x00x00x04x16x00x00x01x70x00x00x00x00x00x00x00x00`" ;; 103 | # Чтение месячных срезов 104 | # 00 0E 1F CE 32 01| 105 | # 106 | '32') answer="`form_com x00${CSN}x${command}x00x00x04x16x00x00x01x70x00x00x00x00x00x00x00x00`" ;; 107 | # Чтение мощности ? 108 | # 00 0E 1F CE 26 |C2 94 109 | # 00 0E 1F CE 26 00 00 |50 CF 110 | '26') answer="`form_com x00${CSN}x${command}x00x00`" ;; 111 | # Дата выхода версии 112 | # 00 0E 1F CE 28 |43 50 113 | # 00 0E 1F CE 28 08 03 00 01 03 10 |DB 4B = 1.03.10 114 | '28') answer="`form_com x00${CSN}x${command}x08x03x00x01x03x10`" ;; 115 | # Серийный номер 116 | # 00 0E 1F CE 2F |02 92 117 | # 00 0E 1F CE 2F 00 69 AD 4E |8C ED = 69AD4E(6925646) 118 | '2f') answer="`form_com x00${CSN}x${command}x00x69xADx4E`" ;; 119 | # Напряжение батареи 120 | # 00 0E 1F CE 29 |82 90 121 | # -00 0E 1F CE 29 03 05 |A0 3F = 3,05В 122 | '29') answer="`form_com x00${CSN}x${command}x03x05`" ;; 123 | # Дата изготовления 124 | # 00 0E 1F CE 66 |C3 64 125 | # -00 0E 1F CE 66 29 10 10 |07 38 = 29.10.10 126 | '66') answer="`form_com x00${CSN}x${command}x29x10x10`" ;; 127 | # 00 0E 1F CE 65 |83 65 128 | # -00 0E 1F CE 65 00 03 |E1 1A 129 | '65') answer="`form_com x00${CSN}x${command}x00x03`" ;; 130 | # Время последнего включения 131 | # 00 0E 1F CE 2C |42 93 132 | # -00 0E 1F CE 2C 01 11 24 06 18 04 11 |5E A2 = 18.04.11 11:24:06 133 | '2c') answer="`form_com x00${CSN}x${command}x01x11x24x06x18x04x11`" ;; 134 | # Время последнего выключения 135 | # 00 0E 1F CE 2B |03 51 136 | # -00 0E 1F CE 2B 03 17 02 35 13 04 11 |4B A3 = 13.04.11 17:02:35 137 | '2b') answer="`form_com x00${CSN}x${command}x03x17x02x35x13x04x11`" ;; 138 | esac 139 | 140 | #echo "answer=${answer}" >&2 141 | HexToChar "${answer}" > "${2}" 142 | } 143 | 144 | SetCounterSN() 145 | { 146 | COUNTER_SN=${COUNTER_SN:='00000000'} 147 | CSN=`echo "${COUNTER_SN}" | awk '{r=sprintf("%06x", substr($0,length($0)-5,6)); for(i=1; i&2 169 | 170 | case $com_name in 171 | 'null') { 172 | ParseNullCom "${com_string}" 173 | 174 | PARAMS="\"${com_string}\"> mode=${mode}" 175 | };; 176 | 'kwatthour') { 177 | zoner=`echo ${com_string} | sed -n 's/^[^:]*:\(.*\)$/\1/p'` 178 | zona="`CheckParameter zona "${zoner}" "${ZONES}" '01'`" 179 | 180 | PARAMS="\"${com_string}\"> zona="${zona} 181 | };; 182 | 'kwatt_month_summ') { 183 | month="`echo ${com_string} | sed -n 's~^[^:]*:\(.*\)~\1~p'`" 184 | month=${month:=1} 185 | #echo "$month" >&2 186 | 187 | [ $month -gt 12 -o $month -lt 1 ] && month='1' 188 | month=`echo $month | sed 's/0\([1-9]\)/\1/'` 189 | month=`expr $month - 1` 190 | #echo "month = $month" >&2 191 | # only the BASH 192 | #month=`printf "%X" $((10#$month))` 193 | month=`printf "%X" $month` 194 | 195 | PARAMS="\"${com_string}\"> month="${month} 196 | };; 197 | 198 | *) PARAMS="none" ;; 199 | esac 200 | 201 | [ $DEBUG -gt 0 ] && echo "COMMAND: $com_name; PARAMS: ${PARAMS}; SIZE: $com_size; OUTPARSER: $outparser; DESCRIBE: ${name}" >&2 202 | 203 | eval cmd=$cmd 204 | eval com_size=$com_size 205 | eval outparser="$outparser" 206 | #echo "$com_name $cmd $com_size $outparser $name" 207 | return 0 208 | } 209 | 210 | 211 | Parser_com() 212 | { 213 | com=$1 214 | request=$2 215 | leng=$3 216 | outparser="$4" 217 | #echo $outparser >&2 218 | 219 | lenn=${#request} 220 | 221 | #echo $com $request $leng 222 | 223 | de=`expr ${lenn} - 6` 224 | sn=`echo $request | cut -c1-3` 225 | snd=`printf "%d" 0$sn` 226 | data=`echo $request | cut -c4-$de` 227 | crc=`echo $request | cut -c$(expr $de + 1)-$lenn` 228 | 229 | #echo sn=$sn data=$data crc=$crc 230 | 231 | if [ $leng -eq $MIN_BLOCK_SIZE ]; then 232 | case $data in 233 | # Ok 234 | x00) { 235 | echo "$com - Ok [${snd}]" 236 | return 0 237 | };; 238 | # Недопустимая команда или параметр. 239 | x01) { 240 | echo "Invalid command or parameter [${snd}]" 241 | return 1 242 | };; 243 | # Внутренняя ошибка счетчика. 244 | x02) { 245 | echo "Internal error counter [${snd}]" 246 | return 2 247 | };; 248 | # Не достаточен уровень доступа для удовлетворения запроса. 249 | x03) { 250 | echo "Not sufficient level of access to satisfy the request [${snd}]" 251 | return 3 252 | };; 253 | # Внутренние часы счетчика уже корректировались в течение текущих суток 254 | x04) { 255 | echo "The internal clock counter has been adjusted for the current day [${snd}]" 256 | return 4 257 | };; 258 | # Не открыт канал связи 259 | x05) { 260 | echo "Do not open the link [${snd}]. Need openread" 261 | return 5 262 | };; 263 | *) { 264 | echo "Unknown code \"$data\" [${snd}]" 265 | return 6 266 | };; 267 | esac 268 | else 269 | 270 | # ParserCommand $data "01D1" 271 | if [ -n "$outparser" ]; then 272 | #echo $outparser >&2 273 | 274 | rezout="`DoOutParser $outparser`" 275 | echo "${rezout}" 276 | return 255 277 | fi 278 | 279 | case $com in 280 | 'null') { 281 | echo $data outparser=$outparser >&2 282 | };; 283 | 'kwatt_summ') { 284 | echo $data | awk -Fx 'function preob(name,val) 285 | { 286 | val=sprintf("%d", val); val=val / 100; printf("%s = %01.02f\n", name, val); 287 | return val; 288 | }; 289 | { 290 | sum=0 291 | val = preob("T1", $6$7$8$9); 292 | sum=sum+val; 293 | val = preob("T2", $10$11$12$13); 294 | sum=sum+val; 295 | val = preob("T3", $14$15$16$17); 296 | sum=sum+val; 297 | val = preob("T4", $18$19$20$21); 298 | sum=sum+val; 299 | printf("%s = %01.02f\n", "Sum", sum); 300 | }' 301 | };; 302 | 303 | 'kwatt_summ2'|'kwatt_month_summ') { 304 | echo $data | awk -Fx 'function preob(name,val) 305 | { 306 | val=sprintf("%d", val); val=val / 100; printf("%s=%01.02f\n", name, val); 307 | return val; 308 | }; 309 | { 310 | sum=0 311 | val = preob("T1", $6$7$8$9); 312 | sum=sum+val; 313 | val = preob("T2", $10$11$12$13); 314 | sum=sum+val; 315 | val = preob("T3", $14$15$16$17); 316 | sum=sum+val; 317 | val = preob("T4", $18$19$20$21); 318 | sum=sum+val; 319 | printf("%s=%01.02f\n", "SUM", sum); 320 | }' 321 | };; 322 | 323 | 'avp') { 324 | echo $data | awk -Fx 'function preob(name,val,delit,format) 325 | { 326 | val=sprintf("%d", val); val=val / delit; printf("%s=%"format"f\n", name, val); 327 | return val; 328 | }; 329 | { 330 | preob("VOLT", $6$7, 10, "01.01") 331 | preob("AMPER", $8$9, 100, "01.02") 332 | preob("WATT", $10$11$12, 1000, "01.03") 333 | 334 | #printf("%s=%01.01f\n", "VOLT", $6$7); 335 | #printf("%s=%01.02f\n", "AMPER", $8$9); 336 | #printf("%s=%01.03f\n", "WATT", $10$11); 337 | }' 338 | };; 339 | 340 | esac 341 | 342 | return 255 343 | fi 344 | } 345 | 346 | -------------------------------------------------------------------------------- /openhab-conf/exec/electo_counters/merc230.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Data read from electric meter 4 | # Merciry 230 5 | # 6 | # 2015-07-07 version 1 7 | # 2016-05-15 version 2 8 | # 2017-04-26 version 2.1 9 | # 2018-01-29 version 2.2 10 | # kohan pavel e-mail: hidersoft@gmail.com Skype: kpp77strannik 11 | # 12 | # 13 | # version 2.2 14 | # 15 | # DONATE Поблагодарить 16 | # Всем, кто считает проделанную работу полезной, 17 | # есть возможность поддержать автора. 18 | # Карта ПриватБанка: 6762 4626 8013 0082. 19 | # Всем заранее спасибо. 20 | # 21 | 22 | 23 | RETRY_QUERY=1 24 | MIN_BLOCK_SIZE=4 25 | MAX_BLOCK_SIZE=255 26 | START_BLOCK_DATA=1 27 | 28 | #T2_CORRECT=5578487 29 | #T3_CORRECT=1501430 30 | # - 21400 31 | # - 6640 20170814 06:50 32 | # 20171130 23:25 33 | # T2_CORRECT=5321236 34 | T2_CORRECT=5315641 35 | # T3_CORRECT=1412463 36 | T3_CORRECT=1414737 37 | 38 | 39 | # T3 2015-10-05 08:20:00 2885216 - 1228915 = 1656301 40 | # T2 2015-10-05 08:20:00 7425400 - 1480530 = 5944970 41 | # miliWATT !! 42 | #WATT_HOUR_CORRECTION_T2=5200 43 | WATT_HOUR_CORRECTION_T2=0.0100 44 | #WATT_HOUR_CORRECTION_T3=4100 45 | WATT_HOUR_CORRECTION_T3=-0.0055 46 | 47 | PASS_R=`StrToHex "${PASS_READ}"` 48 | PASS_W=`StrToHex "${PASS_WRITE}"` 49 | 50 | # modes list 51 | MODES='all_time 0 52 | curr_year 1 53 | prior_year 2 54 | month 3 55 | today 4 56 | yesterday 5 57 | all_time_phase 6' 58 | 59 | # tarifs list 60 | ZONES='T_ALL 00 61 | T1 01 62 | T2 02 63 | T3 03 64 | T4 04 65 | LOST 05 66 | T_NEW 06' 67 | 68 | # 69 | POWERS='P 0 70 | Q 1 71 | S 2' 72 | 73 | #PHAZA 74 | PHAZAS='all 0 75 | 1 1 76 | 2 2 77 | 3 3' 78 | 79 | 80 | # commands list 81 | # alias command size answer parser format description 82 | COMMANDS='test `form_com x${CSN}x00` 4 Тестирование связи 83 | openread `form_com x${CSN}x01x01${PASS_R}` 4 Открытие соединения на чтение 84 | openwrite `form_com x${CSN}x01x02${PASS_W}` 4 Открытие соединения на запись 85 | close `form_com x${CSN}x02` 4 Завершение сеанса 86 | kwatthour `form_com x${CSN}x05x${mode}${month}x${zona}` ${com_size} Опрос накопленной энергии params: mode[]:zona[] 87 | amper `form_com x${CSN}x08x16x2${phaza}` ${com_size} Сила тока A (А) по фазам params: phaza[] 88 | coefw `form_com x${CSN}x08x16x30` 15 Коэффициент мощности (С) по фазам 89 | freq `form_com x${CSN}x08x16x40` 6 Частота Гц 90 | freq2 `form_com x${CSN}x08x16x40` 6 "1,3,2#d#Aprintf(\"%0.2f\",^b0/100)#" Частота Гц 91 | coin `form_com x${CSN}x08x16x5${phaza}` ${com_size} Угол между фазами params: phaza[] 92 | power `form_com x${CSN}x08x16x0${mode}` ${com_size} Мощность P (Вт) по фазам params: POWERS[]:phaza[] 93 | volt `form_com x${CSN}x08x16x1${phaza}` ${com_size} Напряжение U (В) params: phaza[] 94 | null `form_com x${CSN}${mode}` ${MAX_BLOCK_SIZE} "${OutParser}" Произвольная команда 95 | serialnum `form_com x${CSN}x08x00` ${MAX_BLOCK_SIZE} "d1,02d2,02d3,02d4#Sn\\0=\\0\\t|02d5,02d6#Date\\0\\t#0#02d7#20\\t" Серийный номер счетчика и даты выпуска 96 | version `form_com x${CSN}x08x03` ${MAX_BLOCK_SIZE} "d1#version\\0\\t.#0#d2#\\t.#0#d3" Версия ПО 97 | datetime `form_com x${CSN}x04x00` ${MAX_BLOCK_SIZE} "3#0#2#_\\t_#0#1#0#4#\\0\\t\\0#0#5#\\t.#0#6#\\t.#0#7#\\t\\0#0#8" Дата время по счетчику 98 | kwatthour_t2 `form_com x${CSN}x05x00x02` 19 Учетный счетчик, Т2 99 | kwatthour_t3 `form_com x${CSN}x05x00x03` 19 Учетный счетчик, Т3 100 | kwatthour_af `form_com x${CSN}x05x${mode}${month}x${zona}` ${com_size} Внутренний счетчик params: mode[]:month[]:zona[] 101 | kwatthour_phaza `form_com x${CSN}x05x60x${zona}` ${com_size} "$((${phaza} * 4 - 2)),$((${phaza} * 4 - 3)),$((${phaza} * 4)),$((${phaza} * 4 - 1))#d" Накопленная энергия по указанной фазе params: zona[]:phaza[] 102 | power_phaza `form_com x${CSN}x08x16x00` 15 "$((3 + ${phaza} * 3 - 2)),$((3 + ${phaza} * 3)),$((3 + ${phaza} * 3 - 1))#d#a3fffff" Мощность P (Вт) по указанной фазе params: phaza[]' 103 | 104 | 105 | 106 | 107 | 108 | SetCounterSN() 109 | { 110 | COUNTER_SN=${COUNTER_SN:='00000000'} 111 | CSN=`echo "${COUNTER_SN}" | awk '{printf "%02x", substr($0,length($0)-1,2)}'` 112 | } 113 | 114 | Dev_Enulator() 115 | { 116 | #echo "EMU com=${1}" >&2 117 | local command="`echo "${1}" | cut -d"x" -f3 | cut -c1-2`" 118 | local command2="`echo "${1}" | cut -d"x" -f4 | cut -c1-2`" 119 | local command3="`echo "${1}" | cut -d"x" -f5 | cut -c1-2`" 120 | local answer="" 121 | 122 | case $command in 123 | # Тестирование связи 124 | # 11 00 |0D E0 125 | # 11 00 |0D E0 - ответ : Ok 126 | '00') answer="`form_com x${CSN}x00`" ;; 127 | '08') { 128 | case $command2 in 129 | '16') { 130 | case $command3 in 131 | # power 132 | # query 11 08 16 00 |8A BA 133 | # answer 11 40 37 9A 40 82 0D 00 00 00 40 B5 8C |EF B7 134 | '00') answer="`form_com x${CSN}x40x37x9Ax40x82x0Dx00x00x00x40xB5x8C`" ;; 135 | # Частота Гц 136 | # 11 08 16 40 |8B 4A 137 | # 11 00 8C 13 |20 15 - ответ : 50,04 138 | '40') answer="`form_com x${CSN}x00x8Cx13`" ;; 139 | # amper 140 | # query 11 08 16 21 |4A A2 141 | # answer 11 00 DA 00 00 00 00 00 A8 06 |52 B6 142 | '21') answer="`form_com x${CSN}x00xDAx00x00x00x00x00xA8x06`" ;; 143 | # volt 144 | # query 11 08 16 11 |4A B6 145 | # answer 11 00 4E 57 00 4C 57 00 55 57 |FC 3A 146 | '11') answer="`form_com x${CSN}x00x4Ex57x00x4Cx57x00x55x57`" ;; 147 | # coefw 148 | # query 11 08 16 30 |8A AE 149 | # answer 11 40 79 03 40 10 03 00 00 00 40 AF 03 |75 7D 150 | '30') answer="`form_com x${CSN}x40x79x03x40x10x03x00x00x00x40xAFx03`" ;; 151 | esac 152 | } ;; 153 | # Серийный номер счетчика и даты выпуска 154 | # 11 08 00 |26 05 155 | # 11 09 1B 4C 11 02 08 0B |E9 15 - ответ : 9277617 02082011 156 | '00') answer="`form_com x${CSN}x09x1Bx4Cx11x02x08x0B`" ;; 157 | # Версия ПО 158 | # 11 08 03 |66 04 159 | # 11 02 03 01 |65 E8 - ответ : 2.3.1 160 | '03') answer="`form_com x${CSN}x02x03x01`" ;; 161 | esac 162 | } ;; 163 | 164 | # kwatthour 165 | # query 11 05 00 00 |15 19 166 | # answer 11 04 02 4A E2 FF FF FF FF 08 00 1C 92 FF FF FF FF |31 F8 167 | '05') answer="`form_com x${CSN}x04x02x4AxE2xFFxFFxFFxFFx08x00x1Cx92xFFxFFxFFxFF`" ;; 168 | 169 | # Дата время по счетчику 170 | # 11 04 00 |23 05 171 | # 11 13 58 13 02 17 05 16 00 |32 CA - ответ : 13_58_13 02 17.05.16 00 172 | '04') answer="`form_com x${CSN}x13x58x13x02x17x05x16x00`" ;; 173 | 174 | *) :> "${2}" 175 | esac 176 | 177 | #echo "EMU answer=${answer}" >&2 178 | if [ "${ECHOCOMMAND}" = "YES" ]; then 179 | HexToChar ${1}${answer} > "${2}" 180 | else 181 | HexToChar ${answer} > "${2}" 182 | fi 183 | } 184 | 185 | 186 | SetParams() 187 | { 188 | # определить имя команды 189 | com_string=${1} 190 | [ -z "${com_string}" ] && com_string="kwatthour" 191 | com_name="`echo ${com_string} | cut -d":" -f1`" 192 | [ -z "$com_name" ] && com_name=$com_string 193 | 194 | com="${com_name} `CheckParameter "command" "${com_name}" "${COMMANDS}" "" "Command \"$com_name\" unknown!"`" 195 | [ $? -ne 0 ] && return 1 196 | 197 | cmd="`echo "${com}" | cut -d" " -f2`" 198 | com_size="`echo "${com}" | cut -d" " -f3`" 199 | outparser="`$C_ECHO "${com}" | cut -d" " -f4`" 200 | name="`echo "${com}" | cut -d" " -f5`" 201 | 202 | #echo "$com_name $cmd $com_size" >&2 203 | 204 | case $com_name in 205 | 'null') { 206 | ParseNullCom "${com_string}" 207 | 208 | PARAMS="\"${com_string}\"> mode="${mode}" OutParser="$OutParser 209 | };; 210 | 'volt'|'amper'|'coin') { 211 | phaza="`echo ${com_string} | cut -d":" -f2`" 212 | if [ "$phaza" != "$com_name" ]; then 213 | [ -z "$phaza" ] && { 214 | phaza=1 215 | } 216 | else 217 | phaza=1 218 | fi 219 | 220 | case $phaza in 221 | 1) com_size=12 ;; 222 | 2) com_size=9 ;; 223 | 3) com_size=6 ;; 224 | *) com_size=12 ;; 225 | esac 226 | 227 | PARAMS="\"${com_string}\"> phaza="${phaza} 228 | };; 229 | 'power') { 230 | typpowerr="`echo ${com_string} | cut -d":" -f2`" 231 | typpower=0 232 | phaza=0 233 | 234 | if [ "$typpowerr" != "$com_name" ]; then 235 | typpower="`echo "${POWERS}" | sed -n 's/^'${typpowerr}' \(.*\)$/\1/p'`" 236 | [ -z "${typpower}" ] && { 237 | echo "Parameter \"$typpowerr\" unknown!" >&2 238 | typpower=0 239 | } 240 | 241 | phazar=`echo ${com_string} | sed -n 's/^[^:]*:[^:]*:\(.*\)$/\1/p'` 242 | phaza="`CheckParameter phaza "${phazar}" "${PHAZAS}" '1'`" 243 | fi 244 | 245 | mode=`printf "%X" $(expr ${typpower} \* 4 + $phaza)` 246 | 247 | case $phaza in 248 | '0') com_size=15 ;; 249 | *) com_size=12 ;; 250 | esac 251 | 252 | PARAMS="\"${com_string}\"> mode="$mode", typpower="${typpower}", phaza="${phaza} 253 | };; 254 | 'kwatthour'|'kwatthour_af') { 255 | params="`echo ${com_string} | sed -n 's~^[^:]*:\(.*\)~\1~p'`" 256 | 257 | #echo "_$params" >&2 258 | 259 | mode='0' 260 | zona='0' 261 | month='0' 262 | 263 | moder="`echo $params | cut -d':' -f1`" 264 | #echo "moder = $moder" >&2 265 | 266 | if [ -n "$moder" ]; then 267 | 268 | month=`echo "${moder}" | sed -n 's/^[^=]*=\(.*\)$/\1/p'` 269 | if [ -n "${month}" ]; then 270 | moder=`echo "${moder}" | cut -d"=" -f1` 271 | else 272 | month='0'; 273 | fi 274 | #echo "month = $month" >&2 275 | 276 | mode="`CheckParameter mode "${moder}" "${MODES}" '0'`" 277 | 278 | if [ $mode = '3' ]; then 279 | #echo $month >&2 280 | [ $month -gt 12 -o $month -lt 1 ] && month='1' 281 | month=`echo $month | sed 's/0\([1-9]\)/\1/'` 282 | #echo "month = $month" >&2 283 | # only the BASH 284 | #month=`printf "%X" $((10#$month))` 285 | month=`printf "%X" $month` 286 | #echo "month = $month" >&2 287 | else 288 | month='0' 289 | fi 290 | 291 | zoner=`echo ${params} | sed -n 's/^[^:]*:\(.*\)$/\1/p'` 292 | zona="`CheckParameter zona "${zoner}" "${ZONES}" '00'`" 293 | 294 | fi 295 | 296 | zona=`printf "%02X" $zona` 297 | if [ $zona -lt 6 ]; then 298 | case $mode in 299 | '0'|'1'|'2'|'3'|'4'|'5') com_size=19 ;; 300 | '6') com_size=15 ;; 301 | *) com_size=19 ;; 302 | esac 303 | else 304 | com_size=$MAX_BLOCK_SIZE 305 | fi 306 | 307 | PARAMS="\"${com_string}\"> mode="${mode}", zona="${zona}", month="${month} 308 | };; 309 | 310 | 'kwatthour_phaza') 311 | zoner=`echo ${com_string} | sed -n 's/^[^:]*:\([^:]*\).*$/\1/p'` 312 | zona="`CheckParameter zona "${zoner}" "${ZONES}" '00'`" 313 | 314 | phazar=`echo ${com_string} | sed -n 's/^[^:]*:[^:]*:\(.*\)$/\1/p'` 315 | phaza="`CheckParameter phaza "${phazar}" "${PHAZAS}" '1'`" 316 | 317 | com_size=15 318 | 319 | PARAMS="\"${com_string}\"> zona="${zona}", phaza="${phaza} 320 | ;; 321 | 322 | 'power_phaza') 323 | phazar=`echo ${com_string} | sed -n 's/^[^:]*:\(.*\)$/\1/p'` 324 | phaza="`CheckParameter phaza "${phazar}" "${PHAZAS}" '1'`" 325 | 326 | PARAMS="\"${com_string}\"> phaza="${phaza} 327 | ;; 328 | *) PARAMS="none" ;; 329 | esac 330 | 331 | eval cmd=$cmd 332 | eval com_size=$com_size 333 | eval outparser="$outparser" 334 | 335 | [ $DEBUG -gt 0 ] && echo "COMMAND: $com_name; PARAMS: ${PARAMS}; SIZE: $com_size; OUTPARSER: $outparser; DESCRIBE: ${name}" >&2 336 | 337 | #echo "$com_name $cmd $com_size $outparser $name" >&2 338 | return 0 339 | } 340 | 341 | 342 | # CorrectionCounter $data 2 $T2_CORRECT 343 | CorrectionCounter() 344 | { 345 | #local data="${1}" 346 | #case "$2" in 347 | # '2') correct_watt="`sh ${BASE_DIR}correction.sh 2 ${WATT_HOUR_CORRECTION_T2} 2>> ${BASE_DIR}error_corr.log`" ;; 348 | # '3') correct_watt="`sh ${BASE_DIR}correction.sh 3 ${WATT_HOUR_CORRECTION_T3} 2>> ${BASE_DIR}error_corr.log`" ;; 349 | #esac 350 | #[ $? -eq 1 ] && echo "T${2} `date +%Y%m%d%H%M%S`" >> ${BASE_DIR}merc230_last 351 | #echo "2=\"$2\" WATT_HOUR_CORRECTION_T2=$WATT_HOUR_CORRECTION_T2 BASE_DIR=$BASE_DIR correct_watt=$correct_watt" >&2 352 | 353 | T_last=0 354 | T_calc=0 355 | [ -r "${BASE_DIR}/merc230_last_count$2" ] && { 356 | TALL=`tail -n 1 ${BASE_DIR}/merc230_last_count$2 | sed -n '/^T'$2' /{; s/^T'$2' \([^ ]*\) \([^ ]*\) \([^ ]*\)/\2 \3/p;q;}'` 357 | 358 | T_last=`echo "$TALL" | cut -d" " -f1` 359 | T_calc=`echo "$TALL" | cut -d" " -f2` 360 | } 361 | 362 | curr=`echo "$1" | awk -Fx -v cors=${3} 'function preob(val) 363 | { 364 | if(val=="FFFFFFFF")val=0000; val=sprintf("%d", "0x"val); oval=sprintf("%01d", val); 365 | return oval; 366 | }; 367 | { 368 | ovalA=preob($3$2$5$4); 369 | #ovalR=preob($11$10$13$12); 370 | printf("%01d\n", ovalA - cors); 371 | }'` 372 | 373 | eval percent=\$WATT_HOUR_CORRECTION_T$2 374 | 375 | if [ 0$T_last -eq 0 ]; then 376 | curr_calc=$curr 377 | dif_calc=0 378 | else 379 | dif_calc=`echo $curr | awk -v cors=$T_last -v ca=$T_calc -v pc=$percent '{ printf("%01d", ($1 - cors) * pc + ca) }'` 380 | curr_calc=`echo $curr | awk -v cors=$T_last -v ca=$dif_calc '{ printf("%01d", $1 + ca) }'` 381 | fi 382 | 383 | if [ 0$T_last -ne $curr ] || [ ! -r "${BASE_DIR}/merc230_last_count$2" ]; then 384 | echo "T${2} `date +%Y%m%d%H%M%S` $curr $dif_calc" >> ${BASE_DIR}/merc230_last_count$2 385 | fi 386 | 387 | echo $curr_calc 388 | } 389 | 390 | 391 | Parser_com() 392 | { 393 | com=$1 394 | request=$2 395 | leng=$3 396 | outparser="$4" 397 | #echo $outparser >&2 398 | 399 | lenn=${#request} 400 | 401 | #echo $com $request $leng 402 | 403 | de=`expr ${lenn} - 6` 404 | sn=`echo $request | cut -c1-3` 405 | snd=`printf "%d" 0$sn` 406 | data=`echo $request | cut -c4-$de` 407 | crc=`echo $request | cut -c$(expr $de + 1)-$lenn` 408 | 409 | #echo sn=$sn data=$data crc=$crc 410 | 411 | if [ $leng -eq $MIN_BLOCK_SIZE ]; then 412 | case $data in 413 | # Ok 414 | x00) { 415 | echo "$com - Ok [${snd}]" 416 | return 0 417 | };; 418 | # Недопустимая команда или параметр. 419 | x01) { 420 | echo "ERROR: Invalid command or parameter [device: ${snd}]." 421 | return 1 422 | };; 423 | # Внутренняя ошибка счетчика. 424 | x02) { 425 | echo "ERROR: Internal error counter [device: ${snd}]." 426 | return 2 427 | };; 428 | # Не достаточен уровень доступа для удовлетворения запроса. 429 | x03) { 430 | echo "ERROR: Not sufficient level of access to satisfy the request [device: ${snd}]." 431 | return 3 432 | };; 433 | # Внутренние часы счетчика уже корректировались в течение текущих суток 434 | x04) { 435 | echo "ERROR: The internal clock counter has been adjusted for the current day [device: ${snd}]." 436 | return 4 437 | };; 438 | # Не открыт канал связи 439 | x05) { 440 | echo "ERROR: Do not open the link [device:${snd}]. Need openread" 441 | return 5 442 | };; 443 | *) { 444 | echo "ERROR: Unknown code \"$data\" [device: ${snd}]." 445 | return 6 446 | };; 447 | esac 448 | else 449 | 450 | # ParserCommand $data "01D1" 451 | if [ -n "$outparser" ]; then 452 | #echo $outparser >&2 453 | 454 | rezout="`DoOutParser $outparser`" 455 | echo "${rezout}" 456 | return 255 457 | fi 458 | 459 | case $com in 460 | 'null') { 461 | echo $data outparser=$outparser >&2 462 | };; 463 | 'freq') { 464 | echo $data | awk -Fx 'function preob(name,val) 465 | { 466 | val=sprintf("%d", "0x"val); val=val / 100; printf("%s = %01.02f\n", name, val); 467 | }; 468 | {preob("Freq(Hr)", $2$4$3)}' 469 | };; 470 | 'amper') { 471 | echo $data | awk -Fx 'function preob(name,val) 472 | { 473 | val=sprintf("%d", "0x"val); val=val / 1000; printf("%s = %01.03f\n", name, val); 474 | }; 475 | {preob("Ph1(A)", $2$4$3); 476 | preob("Ph2(A)", $5$7$6); 477 | preob("Ph3(A)", $8$10$9)}' 478 | };; 479 | 'volt') { 480 | echo $data | awk -Fx 'function preob(name,val) 481 | { 482 | val=sprintf("%d", "0x"val); val=val / 100; printf("%s = %01.02f\n", name, val); 483 | }; 484 | {preob("Ph1(V)", $2$4$3); 485 | preob("Ph2(V)", $5$7$6); 486 | preob("Ph3(V)", $8$10$9)}' 487 | };; 488 | 'power') { 489 | echo $data | awk -Fx 'function preob(name,val) 490 | { 491 | val=sprintf("%d", "0x"val); printf("%s = %01d\n", name, val); 492 | }; 493 | {preob("Phs(W)", $2$4$3); 494 | preob("Ph1(W)", $5$7$6); 495 | preob("Ph2(W)", $8$10$9); 496 | preob("Ph3(W)", $11$13$12)}' |\ 497 | (while read i1 i2 i3; do 498 | zn=$((i3 & 0x3FFFFF)) 499 | dl=${#zn} 500 | if [ $dl -gt 2 ]; then 501 | st=`expr $dl - 2` 502 | zn2=`echo ${zn} | cut -c$((${st} + 1))-$((${st} + 2)) | sed 's/^[0]*//'` 503 | else 504 | st=1 505 | zn2=0 506 | fi 507 | #printf "%s %s %01d.%02d\n" $i1 $i2 ${zn:0:`expr $dl - 2`} ${zn:`expr $dl - 2`:2}; FOR BASH 508 | #zn=123409 509 | zn1=`echo ${zn} | cut -c1-${st}` 510 | 511 | #echo "zn=$zn st=$st dl=$dl zn1=$zn1 zn2=$zn2" >&2 512 | printf "%s %s %01d,%02d\n" ${i1} ${i2} $zn1 $zn2 # FOR SH 513 | done) 514 | };; 515 | 'coefw') { 516 | echo $data | awk -Fx 'function preob(name,val) 517 | { 518 | val=sprintf("%d", "0x"val); printf("%s = %01d\n", name, val); 519 | }; 520 | {preob("Cosf", $2$4$3); 521 | preob("Cosf1", $5$7$6); 522 | preob("Cosf2", $8$10$9); 523 | preob("Cosf3", $11$13$12)}' |\ 524 | (while read i1 i2 i3; do 525 | zn=$((i3 & 0x3FFFFF)) 526 | # dl=${#zn} 527 | printf "%s %s 0.%03d\n" $i1 $i2 ${zn} 528 | #printf "%s %s %01d\n" $i1 $i2 ${zn} 529 | done) 530 | };; 531 | 532 | 'kwatthour') { 533 | echo $data | awk -Fx -v lenc=$leng 'function preob(name,val) 534 | { 535 | if(val=="FFFFFFFF")val=0000; val=sprintf("%d", "0x"val); val=val / 1000; printf("%s = %01.03f\n", name, val); 536 | }; 537 | { 538 | if (lenc==19) { 539 | preob("Ap(kWh)", $3$2$5$4); 540 | preob("Ao(kWh)", $7$6$9$8); 541 | preob("Rp(kWh)", $11$10$13$12); 542 | preob("Ro(kWh)", $15$14$17$16); 543 | } else { 544 | preob("Ap_F1(kWh)", $3$2$5$4); 545 | preob("Ap_F2(kWh)", $7$6$9$8); 546 | preob("Ap_F3(kWh)", $11$10$13$12); 547 | }; 548 | }' 549 | };; 550 | 'kwatthour_t2') { 551 | CorrectionCounter $data 2 $T2_CORRECT 552 | };; 553 | 'kwatthour_t3') { 554 | CorrectionCounter $data 3 $T3_CORRECT 555 | };; 556 | 557 | 'kwatthour_af') { 558 | echo $data | awk -Fx -v lenc=$leng 'function preob(val) 559 | { 560 | if(val=="FFFFFFFF")val=0000; oval=sprintf("%d", "0x"val); 561 | return oval; 562 | }; 563 | { 564 | if (lenc==19) { 565 | printf("%01d\n%01d\n%01d\n%01d", preob($3$2$5$4), preob($7$6$9$8), preob($11$10$13$12), preob($15$14$17$16)) 566 | } else { 567 | printf("%01d\n%01d\n%01d", preob($3$2$5$4), preob($7$6$9$8), preob($11$10$13$12)) 568 | }; 569 | }' 570 | };; 571 | 572 | esac 573 | return 255 574 | fi 575 | } 576 | 577 | -------------------------------------------------------------------------------- /openhab-conf/items/default.items: -------------------------------------------------------------------------------- 1 | Group Bedroom "Управление спальней" (Bedroom) 2 | Group Bathroom "Управление ванной" (Bathroom) 3 | 4 | //============================================================================================================== 5 | 6 | Group:Number:SUM Water_Sensor "Датчики протечки [%s]" (Water_Sensor) 7 | Switch Water_Sensor_Toilet "Датчики протечки [MAP(motion.map):%s]" (Water_Sensor) {channel ="megad:device:shields:Shield3_P16:in"} 8 | 9 | //============================================================================================================== 10 | 11 | Switch Shield2_P15 "Звонок на входной двери [%s]" {channel ="megad:device:shields:Shield2_P15:in"} 12 | Switch Shield2_P16 "Выключатель Бра на стене спальни. Слева [%s]" {channel ="megad:device:shields:Shield2_P16:in"} 13 | Switch Shield2_P17 "Выключатель в спальне [%s]" {channel ="megad:device:shields:Shield2_P17:in"} 14 | Switch Shield2_P18 "Электрокарниз в спальне - закрыть [%s]" {channel ="megad:device:shields:Shield2_P18:in"} 15 | Switch Shield2_P19 "Электрокарниз в спальне - открыть [%s]" {channel ="megad:device:shields:Shield2_P19:in"} 16 | Switch Shield2_P20 "Выключитель балконной лампы [%s]" {channel ="megad:device:shields:Shield2_P20:in"} 17 | Switch Shield2_P21 "Выключить все в прихожей [%s]" {channel ="megad:device:shields:Shield2_P21:in"} 18 | Switch Shield2_P24 "Включатель люстры на кухне [%s]" {channel ="megad:device:shields:Shield2_P24:in"} 19 | Switch Shield2_P26 "Выключатель в ванной - максимальная яркость [%s]" {channel ="megad:device:shields:Shield2_P26:in"} 20 | 21 | Switch Shield3_P3 "Выключатель Бра на стене спальни. Справа [%s]" {channel ="megad:device:shields:Shield3_P3:in"} 22 | Switch Shield3_P24 "Выключатель ламп в прихожей + шкаф [%s]" {channel ="megad:device:shields:Shield3_P24:in"} 23 | Switch Shield3_P25 "Включатель подсветки шкафа на кухне [%s]" {channel ="megad:device:shields:Shield3_P25:in"} 24 | Switch Shield3_P28 "Выключатель в ванной - минимальная яркость [%s]" {channel ="megad:device:shields:Shield3_P28:in"} 25 | 26 | //============================================================================================================== 27 | 28 | Group Lights_Random 29 | Group:Switch:OR(ON, OFF) Lamp "Управление всем освещением [(%d)]" (Lamp) 30 | Group:Switch:OR(ON, OFF) Service "Служебные выключатели [(%d)]" (Service) 31 | Switch Ghost_Lights "Имитация присутствия, свет" (Lights_Random) 32 | 33 | Dimmer Bedroom_Lamps "Лампы в спальне [%d %%]" (Bedroom) {channel ="megad:device:shields:Bedroom_Lamps:dimmer"} 34 | Switch Bedroom_Lamps_Dimmer "Лампы в спальне [MAP(switch_ru.map):%s]" (Lamp) 35 | Switch Bedroom_LampOnWall_Right "Бра в спальне, справа [MAP(switch_ru.map):%s]" (Lamp, Bedroom) {channel ="megad:device:shields:Bedroom_LampOnWall_Right:out"} 36 | Switch Bedroom_LampOnWall_Left "Бра в спальне, слева [MAP(switch_ru.map):%s]" (Lamp, Bedroom, Lights_Random) {channel ="megad:device:shields:Bedroom_LampOnWall_Left:out"} 37 | Switch Bedroom_TV "TV в спальне [MAP(switch_ru.map):%s]" (Bedroom) {channel ="megad:device:shields:Bedroom_TV:out"} 38 | Number Bedroom_Curtains "Штора в спальне [MAP(curtains.map):%s]" (Bedroom) 39 | Switch Loggia "Лента на лоджии [MAP(switch_ru.map):%s]" (Lamp, Lights_Random) {channel ="megad:device:shields:Loggia:out"} 40 | Switch Kitchen_Cupboard "Подсветка шкафов на кухне [MAP(switch_ru.map):%s]" (Lamp) {channel ="megad:device:shields:Kitchen_Cupboard:out"} 41 | Switch Kitchen_Lamp "Люстра на кухне [MAP(switch_ru.map):%s]" (Lamp) {channel ="megad:device:shields:Kitchen_Lamp:out"} 42 | Switch Toilet_Extractor "Вытяжка в туалете [MAP(switch_ru.map):%s]" {channel ="megad:device:shields:Toilet_Extractor:out"} 43 | Dimmer Toilet_Lamps "Лампы в туалете [%d %%]" {channel ="megad:device:shields:Toilet_Lamps:dimmer"} 44 | Switch Toilet_Lamps_Dimmer "Лампы в туалете [MAP(switch_ru.map):%s]" (Lamp) 45 | Switch Toilet_WaterLeak "Перекрытие воды [MAP(water.map):%s]" (Water_Sensor) 46 | Switch Bell "Звонок в щите [MAP(switch_ru.map):%s]" (Service) {channel ="megad:device:shields:Bell:out"} 47 | Switch Hallway_Bottom "Подсветка в прихожей [MAP(switch_ru.map):%s]" (Lamp) {channel ="megad:device:shields:Hallway_Bottom:out"} 48 | Dimmer Hallway_Lamps "Лампы в прихожей [%d %%]" {channel ="megad:device:shields:Hallway_Lamps:dimmer"} 49 | Switch Hallway_Lamps_Dimmer "Лампы в прихожей [MAP(switch_ru.map):%s]" (Lamp) 50 | Switch Fire "Замыкание датчиков дыма для пульта ТСЖ [MAP(switch_ru.map):%s]" (Service) {channel ="megad:device:shields:Fire:out"} 51 | 52 | //============================================================================================================== 53 | Group:Number:AVG Indoor "Температура в квартире [%.2f °C]" (Indoor) 54 | Group:Number:AVG Pipes "Температура труб [%.2f °C]" (Pipes, Indoor) 55 | Group:Number:AVG Heating "Температура батарей [%.2f °C]" (Heating, Indoor) 56 | Group:Number:AVG Humidity "Влажность в квартире [%.2f °C]" (Humidity) 57 | 58 | Number Shield3_Top_P0_BMx280_Temp "Темп. на улице [%.2f °C]" (Pipes) { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=bmx280&i2c_par=1:60000:REGEX((.*?))]" } //{ channel = "megad:device:shields:Shield3_P0_BME280_temp:temp" } 59 | Number Shield3_Top_P0_BMx280_Hum "Влажность на улице [%.2f %%]" (Humidity) { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=bmx280&i2c_par=2:60000:REGEX((.*?))]" } //{ channel = "megad:device:shields:Shield3_P0_BME280_hum:humidity" } 60 | Number Shield3_Top_P0_BMx280_Press "Атм. давление [%.2f мм рт. ст.]" { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=bmx280:60000:REGEX((.*?))]" } //{ channel = "megad:device:shields:Shield3_P0_BME280_pres:i2c" } 61 | Number Shield3_Top_P0_HTU21D_Temp_Bedroom "Темп. в спальне [%.2f °C]" (Indoor) { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=htu21d&i2c_par=1:60000:REGEX((.*?))]" } 62 | Number Shield3_Top_P0_HTU21D_Hum_Bedroom "Влажность в спальне [%.2f %%]" (Humidity) { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=htu21d:60000:REGEX((.*?))]" } 63 | Number Shield3_Top_P0_MAX44009 "Освещ. улицы [%.2f lux]" { http="<[http://192.168.48.30/sec/?pt=0&scl=1&i2c_dev=max44009:60000:REGEX((.*?))]" } 64 | 65 | Number Shield3_Top_P2_MH_Z14A "Датчик углекислого газа в спальне [%.2f ADC]" (Bedroom) { http="<[http://192.168.48.30/sec/?pt=2&cmd=get:60000:REGEX((.*?))]" } 66 | 67 | Number Shield3_Top_P5_HTU21D_Temp_Bath "Темп. в ванной [%.2f °C]" (Indoor) { http="<[http://192.168.48.30/sec/?pt=5&scl=1&i2c_dev=htu21d&i2c_par=1:60000:REGEX((.*?))]" } 68 | Number Shield3_Top_P5_HTU21D_Hum_Bath "Влажность в ванной [%.2f %%]" (Humidity) { http="<[http://192.168.48.30/sec/?pt=5&scl=1&i2c_dev=htu21d:60000:REGEX((.*?))]" } 69 | 70 | String Shield3_Top_P5_SSD1306_Text "Дисплей SSD1306 Text [%s]" { http=">[*:GET:http://192.168.48.30/sec/?pt=5&text=%2$s]" } 71 | String Shield3_Top_P5_SSD1306_SmallText "Дисплей SSD1306 SmallText [%s]" { http=">[*:GET:http://192.168.48.30/sec/?pt=5&text=%2$s&col=30&row=0]" } 72 | 73 | Number Shield3_Top_P6_DS18B20_WC_cold "Темп. хол. трубы, °C [%.2f]" (Pipes) { http="<[http://192.168.48.30/sec/?pt=6&cmd=list:60000:REGEX(.*?ff160e631603:(.*?);(.*))]" } 74 | Number Shield3_Top_P6_DS18B20_WC_cold_min "Мин. значение хол. трубы в месяце, °C [%.2f]" 75 | Number Shield3_Top_P6_DS18B20_WC_hot "Темп. гор. трубы, °C [%.2f]" (Pipes) { http="<[http://192.168.48.30/sec/?pt=6&cmd=list:60000:REGEX(.*?ff7d30211605:(.*?))]" } 76 | Number Shield3_Top_P6_DS18B20_WC_hot_max "Макс. значение гор. трубы в месяце, °C [%.2f]" 77 | Number Shield3_Top_P6_DS18B20_Bath "Темп. ванны, °C [%.2f]" (Pipes) { http="<[http://192.168.48.30/sec/?pt=6&cmd=list:60000:REGEX(.*?ff9ec0711703:(.*?);(.*))]" } 78 | 79 | Number Shield3_Top_P7_DS18B20_Heat_Kitchen "Темп. бат. кухни [%.2f °C]" (Heating) { http="<[http://192.168.48.30/sec/?pt=7&cmd=list:60000:REGEX(.*?ffbe6e731603:(?!85)(.*?);(.*))]" } 80 | Number Shield3_Top_P7_DS18B20_Heat_Room "Темп. бат. спальни [%.2f °C]" (Heating) { http="<[http://192.168.48.30/sec/?pt=7&cmd=list:60000:REGEX(.*?ff01ec721604:(?!85)(.*?))]" } 81 | Number Shield3_Top_P7_avg "Средняя темп. батареи в месяце [%.2f °C]" 82 | 83 | //============================================================================================================== 84 | Group:Number:SUM ALL_motions "Двери, окна, движения [%s]" 85 | 86 | Group:Number:SUM Doors "Двери [%s]" (Doors) 87 | Switch Door_Entrance "Входная дверь [MAP(door.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P23:in"} 88 | String Door_Entrance_state "Дверь [%s]" 89 | String Door_Entrance_state_general "Входная дверь [%s]" (ALL_motions) 90 | DateTime Door_Entrance_last_use "Door, last use [%1$td.%1$tm, %1$tR]" 91 | Number Door_Entrance_DoorRunStart "P5_DoorRunStart [%s]" 92 | Number Door_Entrance_last_use_ago "Door, last use, h. ago [%.2f]" // http://192.168.48.31:8080/chart?items=Door_Entrance_last_use_ago&period=D&h=900&w=1900 93 | 94 | Switch Door_Bathroom "Дверь в ванную [MAP(door.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P15:in"} 95 | Switch Door_Loggia "Дверь на балкон [MAP(door.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P27:in"} 96 | 97 | Group:Number:SUM Windows "Окна [%s]" (Windows) 98 | Switch Windows_Bedroom_Left "Окно спальни левое [MAP(door.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P26:in"} 99 | Switch Windows_Bedroom_Right "Окно спальни правое [MAP(door.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P26:in"} 100 | 101 | Group:Number:SUM Motion_Sensors "Датчики движения [%s]" (Motion_Sensors) 102 | Switch Motion_Sensors_Outside "Датчики движения коридор [MAP(motion.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P17:in"} 103 | Switch Motion_Sensors_Hallway "Датчики движения прихожая [MAP(motion.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P18:in"} 104 | Switch Motion_Sensors_Kitchen "Датчики движения кухня [MAP(motion.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P19:in"} 105 | Switch Motion_Sensors_Loggia "Датчики движения лоджия [MAP(motion.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P20:in"} 106 | Switch Motion_Sensors_Batch "Датчики движения ванная [MAP(motion.map):%s]" (ALL_motions) {channel ="megad:device:shields:Shield3_P30:in"} 107 | 108 | //============================================================================================================== 109 | 110 | Group Counters "Приборы учета" (Counters) 111 | Group WaterCold 112 | String CountWaterCold "Холодная вода: " 113 | Switch P8_WaterPulse_cold "Холодная, счетчик [%s]" {channel ="megad:device:shields:Shield3_P8:in"} 114 | Number CountWaterM3Cold "ХВС, м. куб. [%.2f]" (Counters) 115 | String CountWaterM3Cold_general "Холодная, м. куб. [%s]" 116 | Number CountWaterM3Cold_Kalends "ХВС на 1е число, м. куб. [%.2f]" (Counters) 117 | Number CountWaterM3Cold_Consumption "ХВС расход в тек.мес., м. куб. [%.2f]" (Counters) 118 | 119 | Group WaterHot 120 | String CountWaterHot "Горячая вода: " 121 | Switch P9_WaterPulse_hot "Горячая, счетчик [%s]" {channel ="megad:device:shields:Shield3_P9:in"} 122 | Number CountWaterM3Hot "ГВС, м. куб. [%.2f]" (Counters) 123 | String CountWaterM3Hot_general "Горячая, м. куб. [%s]" 124 | Number CountWaterM3Hot_Kalends "ГВС на 1е число, м. куб. [%.2f]" (Counters) 125 | Number CountWaterM3Hot_Consumption "ГВС расход в тек.мес., м. куб. [%.2f]" (Counters) 126 | 127 | String Merc200_amper_str "electo_counters" {channel="exec:command:Merc200_amper:output"} 128 | Number Merc200_amper "Сила тока тек. [%.1f A]" 129 | String Merc200_power_str "electo_counters" {channel="exec:command:Merc200_power:output"} 130 | Number Merc200_power "Мощность [%.3f kW]" 131 | String Merc200_volt_str "electo_counters" {channel="exec:command:Merc200_volt:output"} 132 | Number Merc200_volt "Напряжение [%.1f V]" 133 | String Merc200_t1_str "electo_counters" {channel="exec:command:Merc200_t1:output"} 134 | Number Merc200_t1 "Меркурий 200, T1 тек. [%.0f кВт*ч]" 135 | String Merc200_t2_str "electo_counters" {channel="exec:command:Merc200_t2:output"} 136 | Number Merc200_t2 "Меркурий 200, T2 тек. [%.0f кВт*ч]" 137 | String MercuryIncotex201KWh_general "Э/э Меркурий 200, кВт*ч [%s]" (Counters) 138 | Number MercuryIncotex201KWh_Kalends "Э/э на начало месяца, кВт*ч [%.2f]" (Counters) 139 | Number MercuryIncotex201KWh_Consumption "Э/э расход в тек.месяце, кВт*ч [%.2f]" (Counters) 140 | Number MercuryIncotex201KWh_Consumption_Price "Э/э по 3,62 в тек.месяце, руб. [%.2f]" 141 | 142 | //============================================================================================================== 143 | 144 | String USB_Maximum_amplitude "USB Maximum amplitude [%s]" {channel="exec:command:USB_Maximum_amplitude:output"} 145 | Number USB_Maximum_amplitude_dB "Датчик шума коридор [%.2f дБ]" // http://192.168.48.31:8080/chart?items=USB_Maximum_amplitude_dB&period=D&h=900&w=1900 146 | 147 | //============================================================================================================== 148 | 149 | Group:Switch:OR(OFF, ON) Reachable "Недоступное оборудования [(%d)]" (Reachable) 150 | Switch LAN_MikroTik "MikroTik hAP lite RB941-2nD-TC [%s]" (Reachable) { channel="network:pingdevice:LAN_MikroTik:online" } 151 | Switch LAN_MegaD2561_Shield2 "MegaD-2561 щит 2 [%s]" (Reachable) { channel="network:pingdevice:LAN_MegaD2561_Shield2:online" } 152 | Switch LAN_MegaD2561_Shield3 "MegaD-2561 щит 3 [%s]" (Reachable) { channel="network:pingdevice:LAN_MegaD2561_Shield3:online" } 153 | Switch LAN_HIKVISION "HIKVISION DS-2CD2542FWD-IS [%s]" (Reachable) { channel="network:pingdevice:LAN_HIKVISION:online" } 154 | 155 | //============================================================================================================== 156 | 157 | DateTime dateTimeNTP "Дата и время [%1$tA, %1$td.%1$tm.%1$tY, %1$tR]" { channel="ntp:ntp:pool:dateTime" } //расшифровка букв https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html 158 | String dateTime "Дата и время сервера [%s]" 159 | 160 | //============================================================================================================== 161 | 162 | Group Systeminfo "Информация сервера" (Systeminfo) 163 | /* CPU information*/ 164 | Number CPU_Load (Systeminfo) { channel="systeminfo:computer:work:cpu#load"} 165 | Number CPU_Threads (Systeminfo) { channel="systeminfo:computer:work:cpu#threads" } 166 | Number CPU_Uptime (Systeminfo) { channel="systeminfo:computer:work:cpu#uptime" } 167 | 168 | /* Storage information*/ 169 | Number Storage_Total (Systeminfo) { channel="systeminfo:computer:work:storage#total" } 170 | Number Storage_Available_Percent (Systeminfo) { channel="systeminfo:computer:work:storage#availablePercent" } 171 | 172 | /* Memory information*/ 173 | Number Memory_Available (Systeminfo) { channel="systeminfo:computer:work:memory#available" } 174 | Number Memory_Available_Percent (Systeminfo) { channel="systeminfo:computer:work:memory#availablePercent" } 175 | 176 | /* Network information*/ 177 | Number Network_DataSent (Systeminfo) { channel="systeminfo:computer:work:network#dataSent" } 178 | Number Network_DataRecevied (Systeminfo) { channel="systeminfo:computer:work:network#dataReceived" } 179 | 180 | //============================================================================================================== 181 | 182 | Number ChartPeriod "Интервал" 183 | String ChartPeriodName "График: " 184 | 185 | //============================================================================================================== -------------------------------------------------------------------------------- /openhab-conf/persistence/mapdb.persist: -------------------------------------------------------------------------------- 1 | Strategies { 2 | everyHour : "0 0 * * * ?" 3 | } 4 | 5 | Items { 6 | * : strategy = everyChange, restoreOnStartup 7 | } -------------------------------------------------------------------------------- /openhab-conf/persistence/rrd4j.persist: -------------------------------------------------------------------------------- 1 | Strategies { 2 | everyMinute : "0 * * * * ?" 3 | every15min : "0 0/15 * * * ?" 4 | everyHour : "0 0 * * * ?" 5 | everyDay : "0 0 0 * * ?" 6 | } 7 | 8 | Items { 9 | * : strategy = everyChange, everyHour, restoreOnStartup 10 | } -------------------------------------------------------------------------------- /openhab-conf/rules/default.rules: -------------------------------------------------------------------------------- 1 | import org.openhab.core.library.types.* 2 | import org.openhab.core.persistence.* 3 | import org.openhab.model.script.actions.* 4 | import org.joda.time.* 5 | 6 | import java.lang.Math 7 | import java.util.Calendar 8 | import java.util.Date 9 | import java.util.TimeZone 10 | import java.text.SimpleDateFormat 11 | import java.util.Random 12 | 13 | import java.lang.Double.* 14 | import java.lang.String.* 15 | 16 | /* =============================================================================================================== */ 17 | /* 18 | // Начальная настройка показаний 19 | rule "System started Counters" 20 | when 21 | System started 22 | then 23 | postUpdate(CountWaterM3Cold, 53.199) 24 | postUpdate(CountWaterM3Hot, 27.554) 25 | end 26 | */ 27 | /* 28 | rule "initial" //чтобы уйти от NULL в самом начале 29 | when 30 | System started 31 | then 32 | postUpdate(CountWaterM3Hot_Consumption, 0) 33 | postUpdate(CountWaterM3Cold_Consumption, 0) 34 | end 35 | */ 36 | /* =============================================================================================================== */ 37 | //для диммера 38 | rule "Bedroom_Lamps" 39 | when 40 | Item Bedroom_Lamps_Dimmer received command 41 | then 42 | switch(receivedCommand) { 43 | case OFF: postUpdate(Bedroom_Lamps, 0) 44 | case ON: postUpdate(Bedroom_Lamps, 100) 45 | } 46 | end 47 | 48 | rule "Toilet_Lamps" 49 | when 50 | Item Toilet_Lamps_Dimmer received command 51 | then 52 | switch(receivedCommand) { 53 | case OFF: sendCommand(Toilet_Lamps, 0) 54 | case ON: sendCommand(Toilet_Lamps, 100) 55 | } 56 | end 57 | 58 | rule "Hallway_Lamps" 59 | when 60 | Item Hallway_Lamps_Dimmer received command 61 | then 62 | switch(receivedCommand) { 63 | case OFF: sendCommand(Hallway_Lamps, 0) 64 | case ON: sendCommand(Hallway_Lamps, 100) 65 | } 66 | end 67 | 68 | /* =============================================================================================================== */ 69 | // Правило для штор 70 | 71 | rule "Bedroom_Curtains" 72 | when 73 | Item Bedroom_Curtains changed 74 | then 75 | switch(Bedroom_Curtains.state as DecimalType) { 76 | case 0: { //закрыть 77 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=4:0") 78 | Thread::sleep(100) 79 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=3:0") 80 | Thread::sleep(100) 81 | 82 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=3:1") 83 | Thread::sleep(18000) //17000 миллисекунд в секундах 84 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=3:0") 85 | } 86 | case 1: { //СТОП 87 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=4:0") 88 | Thread::sleep(100) 89 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=3:0") 90 | Thread::sleep(100) 91 | } 92 | case 2: { //открыть 93 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=4:0") 94 | Thread::sleep(100) 95 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=3&cmd=3:0") 96 | Thread::sleep(100) 97 | 98 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=4&cmd=4:1") 99 | Thread::sleep(18000) //17000 миллисекунд в секундах 100 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=4&cmd=4:0") 101 | } 102 | } 103 | end 104 | 105 | /* =============================================================================================================== */ 106 | // Правило для перекрытия воды 107 | 108 | rule "Toilet_WaterLeak" 109 | when 110 | Item Toilet_WaterLeak received command 111 | then 112 | switch(receivedCommand) { 113 | case OFF: { //открыть 114 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=8&cmd=8:0") 115 | Thread::sleep(100) 116 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=9&cmd=9:0") 117 | Thread::sleep(100) 118 | 119 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=8&cmd=8:1") 120 | Thread::sleep(17000) //17000 миллисекунд в секундах 121 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=8&cmd=8:0") 122 | } 123 | case ON: { //закрыть 124 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=8&cmd=8:0") 125 | Thread::sleep(100) 126 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=9&cmd=9:0") 127 | Thread::sleep(100) 128 | 129 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=9&cmd=9:1") 130 | Thread::sleep(17000) //17000 миллисекунд в секундах 131 | sendHttpGetRequest("http://192.168.48.20/sec/?pt=9&cmd=9:0") 132 | } 133 | } 134 | end 135 | 136 | /* =============================================================================================================== */ 137 | // дисплей на кухне 138 | 139 | rule "Time to SSD1306" 140 | when 141 | Time cron "0 0/1 * * * ?" //каждую 1 минут 142 | then 143 | var String Hour = String::format( "%1$tk", new Date() ) //https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html 144 | var String Minute = String::format( "%1$tM", new Date() ) 145 | var String Temp = (((Shield3_Top_P0_BMx280_Temp.state as DecimalType)*10).intValue/10.0).toString //оставляем один знак после запятой и преобразуем в строку 146 | 147 | sendHttpGetRequest("http://192.168.48.30/sec/?pt=5&disp_cmd=1&row=0") //очистка верней строки 148 | Thread::sleep(2000) //2000 миллисекунд в секундах 149 | sendCommand(Shield3_Top_P5_SSD1306_Text,"ssssssss") //очистка основной строки 150 | Thread::sleep(2500) //2500 миллисекунд в секундах 151 | sendCommand(Shield3_Top_P5_SSD1306_SmallText, "Time") 152 | sendCommand(Shield3_Top_P5_SSD1306_Text, "_" + Hour + ";" + Minute) 153 | 154 | Thread::sleep(30000) //30000 миллисекунд в секундах 155 | 156 | sendHttpGetRequest("http://192.168.48.30/sec/?pt=5&disp_cmd=1&row=0") //очистка верней строки 157 | Thread::sleep(2000) //2000 миллисекунд в секундах 158 | sendCommand(Shield3_Top_P5_SSD1306_Text,"ssssssss") //очистка основной строки 159 | Thread::sleep(2500) //2500 миллисекунд в секундах 160 | sendCommand(Shield3_Top_P5_SSD1306_SmallText, "Outdoor") 161 | sendCommand(Shield3_Top_P5_SSD1306_Text, "_" + Temp + ":") 162 | end 163 | 164 | 165 | /* =============================================================================================================== */ 166 | // пересчет значений электросчетчика в цифры из текста 167 | /* 168 | rule "Convert String Merc200_amper_str to Item Number" 169 | when 170 | Item Merc200_amper_str changed 171 | then 172 | val newValue = transform("REGEX", ".*=(\\d*.\\d*).*", Merc200_amper_str.state.toString) // use the transformation service to retrieve the value 173 | Merc200_amper.postUpdate( newValue ) // post the new value to the Number Item 174 | end 175 | rule "Convert String Merc200_power_str to Item Number" 176 | when 177 | Item Merc200_power_str changed 178 | then 179 | val newValue = transform("REGEX", ".*=(\\d*.\\d*).*", Merc200_power_str.state.toString) // use the transformation service to retrieve the value 180 | Merc200_power.postUpdate( newValue ) // post the new value to the Number Item 181 | end 182 | rule "Convert String Merc200_volt_str to Item Number" 183 | when 184 | Item Merc200_volt_str changed 185 | then 186 | val newValue = transform("REGEX", ".*=(\\d*.\\d*).*", Merc200_volt_str.state.toString) // use the transformation service to retrieve the value 187 | Merc200_volt.postUpdate( newValue ) // post the new value to the Number Item 188 | end 189 | rule "Convert String Merc200_amper_str to Item Number" 190 | when 191 | Item Merc200_amper_str changed 192 | then 193 | val newValue = transform("REGEX", ".*=(\\d*.\\d*).*", Merc200_amper_str.state.toString) // use the transformation service to retrieve the value 194 | Merc200_amper.postUpdate( newValue ) // post the new value to the Number Item 195 | end 196 | rule "Convert String Merc200_t1_str to Item Number" 197 | when 198 | Item Merc200_t1_str changed 199 | then 200 | val Number Merc200=Float::parseFloat(String::format("%s",Merc200_t1_str.state)) 201 | Merc200_t1.postUpdate( Merc200 ) 202 | end 203 | rule "Convert String Merc200_t2_str to Item Number" 204 | when 205 | Item Merc200_t2_str changed 206 | then 207 | val Number Merc200=Float::parseFloat(String::format("%s",Merc200_t2_str.state)) 208 | Merc200_t2.postUpdate( Merc200 ) 209 | end 210 | */ 211 | /* =============================================================================================================== */ 212 | 213 | //подсчет показаний хол. воды 214 | 215 | rule "CountWaterImpCold" 216 | when 217 | Item P8_WaterPulse_cold changed to ON //received update ON 218 | then 219 | var Number WatCold = CountWaterM3Cold.state as DecimalType 220 | var Number tmp1 221 | var Number Kal1 222 | var Number Dif1 223 | 224 | tmp1 = WatCold + 0.01 // один полный импульс при прохождении 10 л жидкости 225 | postUpdate(CountWaterM3Cold, tmp1.doubleValue) 226 | 227 | if (CountWaterM3Cold.state instanceof DecimalType) { 228 | Kal1 = CountWaterM3Cold.minimumSince(now.toDateMidnight.withDayOfMonth(1)).state as DecimalType //на начало месяца 229 | postUpdate(CountWaterM3Cold_Kalends, Kal1.doubleValue ) 230 | Dif1 = tmp1 - Kal1 231 | postUpdate(CountWaterM3Cold_Consumption, Dif1.doubleValue ) 232 | } 233 | end 234 | 235 | //подсчет показаний гор. воды 236 | rule "CountWaterImpHot" 237 | when 238 | Item P9_WaterPulse_hot changed to ON //received update ON 239 | then 240 | var Number WatHot = CountWaterM3Hot.state as DecimalType 241 | var Number tmp2 242 | var Number Kal2 243 | var Number Dif2 244 | 245 | tmp2 = WatHot + 0.01 // один полный импульс при прохождении 10 л жидкости 246 | postUpdate(CountWaterM3Hot, tmp2.doubleValue) 247 | 248 | if (CountWaterM3Hot.state instanceof DecimalType) { 249 | Kal2 = CountWaterM3Hot.minimumSince(now.toDateMidnight.withDayOfMonth(1)).state as DecimalType //на начало месяца 250 | postUpdate(CountWaterM3Hot_Kalends, Kal2.doubleValue ) 251 | Dif2 = tmp2 - Kal2 252 | postUpdate(CountWaterM3Hot_Consumption, Dif2.doubleValue ) 253 | } 254 | end 255 | 256 | //отображение воды в sitemap 257 | rule "WaterSitemap" 258 | when 259 | Time cron "0 0/10 * * * ?" //каждые 10 минут 260 | then 261 | val CropDigital3 = String::format("%.2f", (CountWaterM3Cold.state as DecimalType).doubleValue ) 262 | val CropDigital4 = String::format("%.2f", (CountWaterM3Cold_Consumption.state as DecimalType).doubleValue ) 263 | postUpdate(CountWaterM3Cold_general, CropDigital3 + " (" + CropDigital4 + " в тек.мес.)" ) 264 | 265 | val CropDigital5 = String::format("%.2f", (CountWaterM3Hot.state as DecimalType).doubleValue ) 266 | val CropDigital6 = String::format("%.2f", (CountWaterM3Hot_Consumption.state as DecimalType).doubleValue ) 267 | postUpdate(CountWaterM3Hot_general, CropDigital5 + " (" + CropDigital6 + " в тек.мес.)" ) 268 | end 269 | 270 | /* =============================================================================================================== */ 271 | //дверь 272 | 273 | rule "Door_Entrance closed" //ON=закрыта 274 | when 275 | Item Door_Entrance changed to ON 276 | then 277 | postUpdate(Door_Entrance_last_use, new DateTimeType() ) 278 | postUpdate(Door_Entrance_state, "закрыта") 279 | end 280 | 281 | rule "Door_Entrance open" //OFF=открыта 282 | when 283 | Item Door_Entrance changed to OFF 284 | then 285 | var Number RunStart 286 | RunStart = now.millis 287 | postUpdate(Door_Entrance_DoorRunStart, RunStart.doubleValue ) // Timestamp when the switch was turned off 288 | postUpdate(Door_Entrance_last_use, new DateTimeType() ) 289 | postUpdate(Door_Entrance_state, "открыта" ) 290 | //postUpdate(Door_Entrance_state_general, "открыта" ) 291 | end 292 | 293 | rule "Door_Entrance_last_use_ago" 294 | when 295 | Time cron "0 0/3 * * * ?" //каждые 3 мин 296 | then 297 | //postUpdate(Door_Entrance_DoorRunStart, 0) 298 | var Number RunStart = Door_Entrance_DoorRunStart.state as DecimalType 299 | var Number DoorTime 300 | var Number RunEnd 301 | RunEnd = now.millis 302 | if (Door_Entrance.state==ON) { 303 | DoorTime = (RunEnd - RunStart) / 3600000 //миллисекунды в часы 304 | postUpdate(Door_Entrance_last_use_ago, DoorTime.doubleValue) 305 | 306 | val CropDigital = String::format("%.2f", DoorTime.doubleValue ) //формат строки для sitemap 307 | postUpdate(Door_Entrance_state_general, Door_Entrance_state.state + " (" + CropDigital + " ч)" ) 308 | } 309 | end 310 | 311 | /* =============================================================================================================== */ 312 | 313 | // правила для физических кнопок 314 | /* 315 | rule "Shield2_P15" 316 | when 317 | Item Shield2_P15 changed to ON 318 | then 319 | sendCommand(Bell, ON) 320 | end 321 | rule "Shield2_P15" 322 | when 323 | Item Shield2_P15 changed to OFF 324 | then 325 | sendCommand(Bell, OFF) 326 | end 327 | 328 | rule "Shield2_P16" 329 | when 330 | Item Shield2_P16 changed to ON 331 | then 332 | if (Bedroom_LampOnWall_Left.state == ON) { sendCommand(Bedroom_LampOnWall_Left, OFF) } 333 | else if (Bedroom_LampOnWall_Left.state == OFF) { sendCommand(Bedroom_LampOnWall_Left, ON) } 334 | end 335 | 336 | rule "Shield2_P17" 337 | when 338 | Item Shield2_P17 changed to ON 339 | then 340 | if (Bedroom_Lamps.state > 1) { sendCommand(Bedroom_Lamps, 0) } 341 | else if (Bedroom_Lamps.state == 0) { sendCommand(Bedroom_Lamps, 100) } 342 | end 343 | 344 | rule "Shield2_P18" 345 | when 346 | Item Shield2_P18 changed to ON 347 | then 348 | sendCommand(Bedroom_Curtains, 0) 349 | end 350 | 351 | rule "Shield2_P19" 352 | when 353 | Item Shield2_P19 changed to ON 354 | then 355 | sendCommand(Bedroom_Curtains, 1) 356 | end 357 | 358 | rule "Shield2_P20" 359 | when 360 | Item Shield2_P20 changed to ON 361 | then 362 | if (Loggia.state == ON) { sendCommand(Loggia, OFF) } 363 | else if (Loggia.state == OFF) { sendCommand(Loggia, ON) } 364 | end 365 | 366 | rule "Shield2_P21" //выключить всё 367 | when 368 | Item Shield2_P21 changed to ON 369 | then 370 | sendCommand(Bedroom_Lamps, 0) 371 | sendCommand(Bedroom_TV, OFF) 372 | sendCommand(Bedroom_LampOnWall_Right, OFF) 373 | sendCommand(Bedroom_LampOnWall_Left, OFF) 374 | sendCommand(Loggia, OFF) 375 | sendCommand(Kitchen_Cupboard, OFF) 376 | sendCommand(Kitchen_Lamp, OFF) 377 | sendCommand(Toilet_Lamps, 0) 378 | sendCommand(Hallway_Bottom, OFF) 379 | Thread::sleep(15000) //15000 миллисекунд в секундах 380 | sendCommand(Hallway_Lamps, 0) 381 | end 382 | 383 | rule "Shield2_P24" 384 | when 385 | Item Shield2_P24 changed to ON 386 | then 387 | if (Kitchen_Lamp.state == ON) { sendCommand(Kitchen_Lamp, OFF) } 388 | else if (Kitchen_Lamp.state == OFF) { sendCommand(Kitchen_Lamp, ON) } 389 | end 390 | 391 | rule "Shield2_P26" 392 | when 393 | Item Shield2_P26 changed to ON 394 | then 395 | if (Toilet_Lamps.state > 31) { sendCommand(Toilet_Lamps, 0) } 396 | else if (Toilet_Lamps.state == 0) { sendCommand(Toilet_Lamps, 100) } 397 | end 398 | 399 | 400 | rule "Shield3_P3" 401 | when 402 | Item Shield3_P3 changed to ON 403 | then 404 | if (Bedroom_LampOnWall_Right.state == ON) { sendCommand(Bedroom_LampOnWall_Right, OFF) } 405 | else if (Bedroom_LampOnWall_Right.state == OFF) { sendCommand(Bedroom_LampOnWall_Right, ON) } 406 | end 407 | 408 | rule "Shield3_P24" 409 | when 410 | Item Shield3_P24 changed to ON 411 | then 412 | if (Hallway_Lamps.state > 2) { sendCommand(Hallway_Lamps, 0) } 413 | else if (Hallway_Lamps.state == 0) { sendCommand(Hallway_Lamps, 100) } 414 | end 415 | 416 | rule "Shield3_P25" 417 | when 418 | Item Shield3_P25 changed to ON 419 | then 420 | if (Kitchen_Cupboard.state == ON) { sendCommand(Kitchen_Cupboard, OFF) } 421 | else if (Kitchen_Cupboard.state == OFF) { sendCommand(Kitchen_Cupboard, ON) } 422 | end 423 | 424 | rule "Shield3_P28" 425 | when 426 | Item Shield3_P28 changed to ON 427 | then 428 | if (Toilet_Lamps.state >=1 ) { sendCommand(Toilet_Lamps, 0) } 429 | else if (Toilet_Lamps.state == 0) { sendCommand(Toilet_Lamps, 4) } 430 | end 431 | 432 | */ 433 | 434 | /* =============================================================================================================== */ 435 | 436 | /* 437 | //Начало правила для штор 438 | //variables to store current state of Bedroom_Curtains https://github.com/openhab/openhab1-addons/wiki/Rollershutter-Bindings 439 | var Number Bedroom_CurtainsOldState = 50 440 | var Number Bedroom_CurtainsLastUp = 0 441 | var Number Bedroom_CurtainsLastDown = 0 442 | 443 | //URL to be called as HTPP GET. Up and Down start moving shutting either until completely moved or until Stop called. 444 | var String Bedroom_CurtainsDownActionUrl = "http://192.168.48.20/sec/?pt=4&cmd=3:1" 445 | var String Bedroom_CurtainsUpActionUrl = "http://192.168.48.20/sec/?pt=4&cmd=4:1" 446 | var String Bedroom_CurtainsStopActionUrlDown = "http://192.168.48.20/sec/?pt=4&cmd=3:0" 447 | var String Bedroom_CurtainsStopActionUrlUp = "http://192.168.48.20/sec/?pt=4&cmd=4:0" 448 | 449 | //time in ms needed to completely open and close Bedroom_Curtains, respectively 450 | var Number Bedroom_Curtains_FULL_UP_TIME = 17000 451 | var Number Bedroom_Curtains_FULL_DOWN_TIME = 17000 452 | 453 | rule "Bedroom_Curtains Save Old State Rule" 454 | when 455 | Item Bedroom_Curtains changed 456 | then 457 | Bedroom_CurtainsOldState = previousState as DecimalType 458 | end 459 | 460 | rule "Bedroom_Curtains Control Rule" 461 | when 462 | Item Bedroom_Curtains received command 463 | then 464 | if(receivedCommand !== null){ 465 | var Number upTime = now.millis - Bedroom_CurtainsLastUp 466 | var Number downTime = now.millis - Bedroom_CurtainsLastDown 467 | switch(receivedCommand.toString.upperCase) { 468 | case "STOP" :{ 469 | var Number newState = -1 470 | if(upTime < downTime && upTime < Bedroom_Curtains_FULL_UP_TIME) { 471 | //last action was up and still going UP. 472 | //0% is open! 473 | var Number percentMoved = ((upTime) * 100 / Bedroom_Curtains_FULL_UP_TIME).intValue 474 | newState = Bedroom_CurtainsOldState - percentMoved 475 | logInfo("Bedroom_CurtainsOldState: " + Bedroom_CurtainsOldState + " UP: " + percentMoved + "% in " + upTime/1000 + "sec. Now: " + newState+ "%" ) 476 | } else if(upTime > downTime && downTime < Bedroom_Curtains_FULL_DOWN_TIME) { 477 | //last action was down and still going DOWN. 478 | //100% is closed! 479 | var Number percentMoved = ((downTime) * 100 / Bedroom_Curtains_FULL_DOWN_TIME).intValue 480 | newState = Bedroom_CurtainsOldState + percentMoved 481 | logInfo("Bedroom_CurtainsOldState: " + Bedroom_CurtainsOldState + "% DOWN: " + percentMoved + "% in " + downTime/1000 + "sec. Now: " + newState+ "%" ) 482 | } 483 | if(newState > 0 && newState < 100) { 484 | postUpdate(Bedroom_Curtains, newState) 485 | if(Bedroom_CurtainsStopActionUrlDown !== null){ 486 | sendHttpGetRequest(Bedroom_CurtainsStopActionUrlDown) 487 | sendHttpGetRequest(Bedroom_CurtainsStopActionUrlUp) 488 | } 489 | } 490 | } 491 | case "UP" : { 492 | if(upTime < Bedroom_Curtains_FULL_UP_TIME) { 493 | //still going up. ignore. 494 | } else { 495 | Bedroom_CurtainsLastUp = now.millis 496 | if(Bedroom_CurtainsUpActionUrl !== null){ 497 | sendHttpGetRequest(Bedroom_CurtainsUpActionUrl) 498 | } 499 | } 500 | } 501 | case "DOWN":{ 502 | if(downTime < Bedroom_Curtains_FULL_DOWN_TIME) { 503 | //still going up. ignore. 504 | } else { 505 | Bedroom_CurtainsLastDown = now.millis 506 | if(Bedroom_CurtainsDownActionUrl !== null){ 507 | sendHttpGetRequest(Bedroom_CurtainsDownActionUrl) 508 | } 509 | } 510 | } 511 | } 512 | } 513 | end 514 | 515 | rule "Bedroom_Curtains UP" 516 | when 517 | Item Bedroom_Curtains received command UP //открыть 518 | then 519 | postUpdate(Bedroom_Curtains, 100) 520 | publish("mosquitto","megad/20/cmd","4=1") 521 | Thread::sleep(8500) //половина 522 | postUpdate(Bedroom_Curtains, 50) 523 | Thread::sleep(8500) //17000 миллисекунд в секундах 524 | publish("mosquitto","megad/20/cmd","4=0") 525 | postUpdate(Bedroom_Curtains, 0) 526 | end 527 | 528 | rule "Bedroom_Curtains DOWN" 529 | when 530 | Item Bedroom_Curtains received command DOWN //закрыть 531 | then 532 | postUpdate(Bedroom_Curtains, 0) 533 | publish("mosquitto","megad/20/cmd","3=1") 534 | Thread::sleep(8500) //половина 535 | postUpdate(Bedroom_Curtains, 50) 536 | Thread::sleep(8500) //17000 миллисекунд в секундах 537 | publish("mosquitto","megad/20/cmd","3=0") 538 | postUpdate(Bedroom_Curtains, 100) 539 | end 540 | 541 | rule "Bedroom_Curtains STOP" 542 | when 543 | Item Bedroom_Curtains received command STOP //стоп 544 | then 545 | publish("mosquitto","megad/20/cmd","3=0") 546 | publish("mosquitto","megad/20/cmd","4=0") 547 | end 548 | */ 549 | -------------------------------------------------------------------------------- /openhab-conf/sitemaps/default.sitemap: -------------------------------------------------------------------------------- 1 | sitemap default label="Революции 48А - ЖК Гуллливер" 2 | { 3 | Frame label="Квартира" { 4 | Text item=Lamp { 5 | Switch item=Lamp mappings=[OFF="ВЫКЛ всё", ON="ВКЛ всё"] 6 | Default item=Bedroom_Lamps 7 | Default item=Bedroom_LampOnWall_Right 8 | Default item=Bedroom_LampOnWall_Left 9 | Default item=Loggia 10 | Default item=Kitchen_Cupboard 11 | Default item=Kitchen_Lamp 12 | Default item=Toilet_Lamps 13 | Default item=Hallway_Bottom 14 | Default item=Hallway_Lamps 15 | } 16 | Text item=Bedroom { 17 | Default item=Bedroom_Lamps 18 | Default item=Bedroom_LampOnWall_Right 19 | Default item=Bedroom_LampOnWall_Left 20 | Switch item=Bedroom_Curtains mappings=[0="Закр.", 1="СТОП", 2="Откр."] 21 | Default item=Bedroom_TV 22 | Default item=Shield3_Top_P2_MH_Z14A 23 | Default item=Shield3_Top_P0_HTU21D_Temp_Bedroom 24 | Default item=Shield3_Top_P0_HTU21D_Hum_Bedroom 25 | Default item=Shield3_Top_P7_DS18B20_Heat_Room 26 | } 27 | Text item=Bathroom { 28 | Default item=Toilet_WaterLeak 29 | Text item=Water_Sensor_Toilet 30 | Default item=Toilet_Extractor 31 | Default item=Shield3_Top_P5_HTU21D_Temp_Bath 32 | Default item=Shield3_Top_P5_HTU21D_Hum_Bath 33 | Default item=Shield3_Top_P6_DS18B20_WC_cold 34 | Default item=Shield3_Top_P6_DS18B20_WC_hot 35 | Default item=Shield3_Top_P6_DS18B20_Bath 36 | } 37 | Group item=Indoor { 38 | Frame label="Температура в квартире" { 39 | Text item=Shield3_Top_P0_HTU21D_Temp_Bedroom 40 | Text item=Shield3_Top_P5_HTU21D_Temp_Bath 41 | } 42 | Frame label="Температура батарей" { 43 | Text item=Shield3_Top_P7_DS18B20_Heat_Kitchen 44 | Text item=Shield3_Top_P7_DS18B20_Heat_Room 45 | } 46 | Frame label="Температура труб" { 47 | Text item=Shield3_Top_P6_DS18B20_WC_cold 48 | Text item=Shield3_Top_P6_DS18B20_WC_hot 49 | Text item=Shield3_Top_P6_DS18B20_Bath 50 | /*Switch item=ChartPeriod label="Температура труб" mappings=[0="12 часов", 1="3 дня", 2="2 недели", 3="4 месяца"] 51 | Chart item=Pipes period=12h refresh=30000 visibility=[ChartPeriod==0, ChartPeriod=="Uninitialized"] 52 | Chart item=Pipes period=3D refresh=60000 visibility=[ChartPeriod==1] 53 | Chart item=Pipes period=2W refresh=60000 visibility=[ChartPeriod==2] 54 | Chart item=Pipes period=4M refresh=60000 visibility=[ChartPeriod==3]*/ 55 | } 56 | } 57 | Group item=Humidity 58 | Group item=ALL_motions { 59 | Frame label="Двери" { 60 | Text item=Door_Entrance 61 | Text item=Door_Entrance_state_general 62 | Text item=Door_Bathroom 63 | Text item=Door_Loggia 64 | } 65 | Frame label="Окна" { 66 | Text item=Windows_Bedroom_Left 67 | Text item=Windows_Bedroom_Right 68 | } 69 | Frame label="Датчики движения" { 70 | Text item=Motion_Sensors_Outside 71 | Text item=Motion_Sensors_Hallway 72 | Text item=Motion_Sensors_Kitchen 73 | Text item=Motion_Sensors_Loggia 74 | Text item=Motion_Sensors_Batch 75 | } 76 | } 77 | Text item=Counters { 78 | Frame label="Электроэнергия" { 79 | Default item=Merc200_amper 80 | Default item=Merc200_power 81 | Default item=Merc200_volt 82 | /*Switch item=ChartPeriod label="Сила тока" mappings=[0="12 часов", 1="3 дня", 2="2 недели", 3="4 месяца"] 83 | Chart item=Merc200_amper period=12h refresh=30000 visibility=[ChartPeriod==0, ChartPeriod=="Uninitialized"] 84 | Chart item=Merc200_amper period=3D refresh=60000 visibility=[ChartPeriod==1] 85 | Chart item=Merc200_amper period=2W refresh=60000 visibility=[ChartPeriod==2] 86 | Chart item=Merc200_amper period=4M refresh=60000 visibility=[ChartPeriod==3] */ 87 | Default item=Merc200_t1 88 | Default item=Merc200_t2 89 | } 90 | Frame label="Холодная вода (ХВС)" { 91 | Text item=CountWaterM3Cold_general 92 | Text item=CountWaterM3Cold_Kalends 93 | } 94 | Frame label="Горячая вода (ГВС)" { 95 | Text item=CountWaterM3Hot_general 96 | Text item=CountWaterM3Hot_Kalends 97 | } 98 | } 99 | } 100 | 101 | Frame label="Улица" { 102 | Text item=Shield3_Top_P0_BMx280_Temp /*{ 103 | Switch item=ChartPeriod label="Температура улицы" mappings=[0="12 часов", 1="3 дня", 2="2 недели", 3="4 месяца"] 104 | Chart item=Shield3_Top_P0_BMx280_Temp period=12h refresh=30000 visibility=[ChartPeriod==0, ChartPeriod=="Uninitialized"] 105 | Chart item=Shield3_Top_P0_BMx280_Temp period=3D refresh=60000 visibility=[ChartPeriod==1] 106 | Chart item=Shield3_Top_P0_BMx280_Temp period=2W refresh=60000 visibility=[ChartPeriod==2] 107 | Chart item=Shield3_Top_P0_BMx280_Temp period=4M refresh=60000 visibility=[ChartPeriod==3] 108 | Switch item=ChartPeriod label="Освещ. улицы" mappings=[0="12 часов", 1="3 дня", 2="2 недели", 3="4 месяца"] 109 | Chart item=Shield3_Top_P0_MAX44009 period=12h refresh=30000 visibility=[ChartPeriod==0, ChartPeriod=="Uninitialized"] 110 | Chart item=Shield3_Top_P0_MAX44009 period=3D refresh=60000 visibility=[ChartPeriod==1] 111 | Chart item=Shield3_Top_P0_MAX44009 period=2W refresh=60000 visibility=[ChartPeriod==2] 112 | Chart item=Shield3_Top_P0_MAX44009 period=4M refresh=60000 visibility=[ChartPeriod==3] 113 | }*/ 114 | Text item=Shield3_Top_P0_BMx280_Hum 115 | Text item=Shield3_Top_P0_BMx280_Press 116 | Text item=Shield3_Top_P0_MAX44009 117 | } 118 | 119 | Frame label="Служебное" { 120 | Text item=dateTimeNTP 121 | Group item=Service 122 | //Default item=USB_Maximum_amplitude_dB 123 | Group item=Systeminfo 124 | Group item=Reachable 125 | } 126 | 127 | } 128 | -------------------------------------------------------------------------------- /openhab-conf/things/default.things: -------------------------------------------------------------------------------- 1 | Bridge megad:bridge:shields [port=8090] 2 | { 3 | //кнопки 4 | Thing device Shield2_P15 [hostname="192.168.48.20", port="15", password="sec", refresh="0"] 5 | Thing device Shield2_P16 [hostname="192.168.48.20", port="16", password="sec", refresh="0"] 6 | Thing device Shield2_P17 [hostname="192.168.48.20", port="17", password="sec", refresh="0"] 7 | Thing device Shield2_P18 [hostname="192.168.48.20", port="18", password="sec", refresh="0"] 8 | Thing device Shield2_P19 [hostname="192.168.48.20", port="19", password="sec", refresh="0"] 9 | Thing device Shield2_P20 [hostname="192.168.48.20", port="20", password="sec", refresh="0"] 10 | Thing device Shield2_P21 [hostname="192.168.48.20", port="21", password="sec", refresh="0"] 11 | Thing device Shield2_P24 [hostname="192.168.48.20", port="24", password="sec", refresh="0"] 12 | Thing device Shield2_P26 [hostname="192.168.48.20", port="26", password="sec", refresh="0"] 13 | Thing device Shield3_P3 [hostname="192.168.48.30", port="3", password="sec", refresh="0"] 14 | Thing device Shield3_P24 [hostname="192.168.48.30", port="24", password="sec", refresh="0"] 15 | Thing device Shield3_P25 [hostname="192.168.48.30", port="25", password="sec", refresh="0"] 16 | Thing device Shield3_P28 [hostname="192.168.48.30", port="28", password="sec", refresh="0"] 17 | //светильники 18 | Thing device Bedroom_LampOnWall_Right [hostname="192.168.48.20", port="0", password="sec", refresh="10"] 19 | Thing device Bedroom_LampOnWall_Left [hostname="192.168.48.20", port="1", password="sec", refresh="10"] 20 | Thing device Bedroom_Lamps [hostname="192.168.48.20", port="28", password="sec", refresh="10"] 21 | Thing device Bedroom_TV [hostname="192.168.48.20", port="2", password="sec", refresh="10"] 22 | Thing device Bedroom_Curtains_Open [hostname="192.168.48.20", port="3", password="sec", refresh="10"] 23 | Thing device Bedroom_Curtains_Close [hostname="192.168.48.20", port="4", password="sec", refresh="10"] 24 | Thing device Loggia [hostname="192.168.48.20", port="5", password="sec", refresh="10"] 25 | Thing device Kitchen_Cupboard [hostname="192.168.48.20", port="7", password="sec", refresh="10"] 26 | Thing device Kitchen_Lamp [hostname="192.168.48.20", port="13", password="sec", refresh="10"] 27 | Thing device Toilet_Extractor [hostname="192.168.48.20", port="22", password="sec", refresh="10"] 28 | Thing device Toilet_Lamps [hostname="192.168.48.20", port="25", password="sec", refresh="10"] 29 | Thing device Toilet_WaterLeak_Open [hostname="192.168.48.20", port="8", password="sec", refresh="10"] 30 | Thing device Toilet_WaterLeak_Close [hostname="192.168.48.20", port="9", password="sec", refresh="10"] 31 | Thing device Bell [hostname="192.168.48.20", port="10", password="sec", refresh="10"] 32 | Thing device Hallway_Bottom [hostname="192.168.48.20", port="23", password="sec", refresh="10"] 33 | Thing device Hallway_Lamps [hostname="192.168.48.20", port="27", password="sec", refresh="10"] 34 | //Счетчик ГВС|ХВС 35 | Thing device Shield3_P8 [hostname="192.168.48.30", port="8", password="sec", refresh="60"] 36 | Thing device Shield3_P9 [hostname="192.168.48.30", port="9", password="sec", refresh="60"] 37 | //датчики движения 38 | Thing device Shield3_P17 [hostname="192.168.48.30", port="17", password="sec", refresh="10"] 39 | Thing device Shield3_P18 [hostname="192.168.48.30", port="18", password="sec", refresh="10"] 40 | Thing device Shield3_P19 [hostname="192.168.48.30", port="19", password="sec", refresh="10"] 41 | Thing device Shield3_P20 [hostname="192.168.48.30", port="20", password="sec", refresh="10"] 42 | Thing device Shield3_P30 [hostname="192.168.48.30", port="30", password="sec", refresh="10"] 43 | //окна 44 | Thing device Shield3_P26 [hostname="192.168.48.30", port="26", password="sec", refresh="10"] 45 | Thing device Shield3_P26 [hostname="192.168.48.30", port="26", password="sec", refresh="10"] 46 | //двери 47 | Thing device Shield3_P23 [hostname="192.168.48.30", port="23", password="sec", refresh="10"] 48 | Thing device Shield3_P15 [hostname="192.168.48.30", port="15", password="sec", refresh="10"] 49 | Thing device Shield3_P27 [hostname="192.168.48.30", port="27", password="sec", refresh="10"] 50 | //протечка 51 | Thing device Shield3_P16 [hostname="192.168.48.30", port="16", password="sec", refresh="20"] 52 | } 53 | 54 | //============================================================================================================== 55 | 56 | Thing network:pingdevice:LAN_HIKVISION [ hostname="192.168.48.40" ] 57 | Thing network:pingdevice:LAN_MegaD2561_Shield2 [ hostname="192.168.48.20" ] 58 | Thing network:pingdevice:LAN_MegaD2561_Shield3 [ hostname="192.168.48.30" ] 59 | Thing network:pingdevice:LAN_MikroTik [ hostname="192.168.48.1" ] 60 | 61 | //============================================================================================================== 62 | 63 | Thing exec:command:USB_Maximum_amplitude [command="bash /etc/openhab2/exec/USB_dB.sh", transform="REGEX((.*?))", interval=60, autorun=true] 64 | Thing exec:command:Merc200_amper [command="sh /etc/openhab2/exec/electo_counters/electro_counter.sh amper", transform="REGEX((.*?))", interval=70, autorun=true] 65 | Thing exec:command:Merc200_power [command="sh /etc/openhab2/exec/electo_counters/electro_counter.sh power", transform="REGEX((.*?))", interval=80, autorun=true] 66 | Thing exec:command:Merc200_volt [command="sh /etc/openhab2/exec/electo_counters/electro_counter.sh volt", transform="REGEX((.*?))", interval=300, autorun=true] 67 | Thing exec:command:Merc200_t1 [command="sh /etc/openhab2/exec/electo_counters/electro_counter.sh kwatthour:T1", transform="REGEX((.*?))", interval=3600, autorun=true] 68 | Thing exec:command:Merc200_t2 [command="sh /etc/openhab2/exec/electo_counters/electro_counter.sh kwatthour:T2", transform="REGEX((.*?))", interval=3700, autorun=true] 69 | 70 | //============================================================================================================== 71 | 72 | Thing systeminfo:computer:work [interval_high=60, interval_medium=120] 73 | 74 | //============================================================================================================== 75 | 76 | ntp:ntp:pool [ hostname="nl.pool.ntp.org", refreshInterval=60, refreshNtp=30 ] 77 | 78 | //============================================================================================================== 79 | 80 | 81 | //============================================================================================================== 82 | 83 | 84 | //============================================================================================================== 85 | 86 | 87 | //============================================================================================================== -------------------------------------------------------------------------------- /openhab-conf/transform/curtains.map: -------------------------------------------------------------------------------- 1 | 0.0=Закрыто 2 | 0=Закрыто 3 | 1=Остановлено 4 | 2=Открыто 5 | -=нет данных 6 | NULL=нет данных -------------------------------------------------------------------------------- /openhab-conf/transform/door.map: -------------------------------------------------------------------------------- 1 | ON=закрыта 2 | OFF=открыта 3 | NULL=нет данных 4 | -=нет данных -------------------------------------------------------------------------------- /openhab-conf/transform/motion.map: -------------------------------------------------------------------------------- 1 | ON=движение 2 | OFF=спокойно 3 | NULL=нет данных 4 | -=нет данных -------------------------------------------------------------------------------- /openhab-conf/transform/motion_astra.map: -------------------------------------------------------------------------------- 1 | OFF=спокойно 2 | ON=движение 3 | NULL=нет данных 4 | -=нет данных -------------------------------------------------------------------------------- /openhab-conf/transform/switch_ru.map: -------------------------------------------------------------------------------- 1 | ON=ВКЛ 2 | OFF=ВЫКЛ 3 | NULL=нет данных 4 | -=нет данных -------------------------------------------------------------------------------- /openhab-conf/transform/water.map: -------------------------------------------------------------------------------- 1 | ON=перекрыта 2 | OFF=течет 3 | NULL=нет данных 4 | -=нет данных --------------------------------------------------------------------------------