среда, 26 февраля 2020 г.

Domoticz. Уведомления о работах на линии РОССЕТИ

В продолжение моих изысканий на тему удобной работы с МРСК Северо-Запад (РОССЕТИ). Есть у них информационная страница с данными об плановых отключениях. Там же можно подписаться на e-mail рассылку об отключениях (UPD! 03.2020 оно не работает, появились события о работах, а электронное письмо не пришло). Между тем, добавлю эту информацию в Domoticz и настрою уведомления о будущих работах через телеграм, или как событие в гугл-календарь.

Будем парсить страницу МРСК на записи о работах и отправлять их на новый текстовый сенсор
Запишем его idx. Создаём новый скрипт в domoticz\scripts
nano rosseti-alarm.sh
#!/bin/bash
# Get info from https://clients.mrsksevzap.ru/poweroutage

# Domoticz Configuration
SERVER='localhost:port/'
SERVER_CMD='json.htm?type=command&param=udevice&'
SERVER_RID='json.htm?type=devices&'
idx='116'

# Telegram Config
TOKEN=999999999:AAGuU83B72CeYgY7DQmsqFWy2pXecizeE5Y
CHAT_ID=123456789
URL="https://api.telegram.org/bot$TOKEN/sendMessage"

# City info
subject='karel'
district='Медвежьегорский район'
settlement='Пиндуши'
street='all'
events=$(curl "https://clients.mrsksevzap.ru/poweroutage?search=true&affil=&outage-type=all&subject={$subject}&district={$district}&settlement={$settlement}&street={$street}&startFrom=&startTo=" --compressed --insecure --silent > /tmp/rosseti-pind)

# Parse
last_event=$(cat /tmp/rosseti-pind | grep "<td>" | grep -o -P '(?<=\<td\>)(.+?)(?=<\/td>)' | head -n 8)
locate=$(echo "$last_event" | sed -n '1,2p' | tr '\n' ' ')
whenstart=$(echo "$last_event" | sed -n '3,4p' | tr '\n' ' ')
whenfin=$(echo "$last_event" | sed -n '5,6p' | tr '\n' ' ')
reason=$(echo "$last_event" | sed -n '7,8p' | tr '\n' ' ')

# Send data to Domoticz
domoticztext=$(echo "$whenstart по $whenfin $reason" | sed 's/ /%20/g')
curr_state=$(curl -sS "http://{$SERVER}{$SERVER_RID}rid={$idx}" | grep Data | grep -o -P '(?<=: ")(.+?)(?=")' | sed 's/ /%20/g')
if [[ "$domoticztext" == "$curr_state" ]]; then
echo "No new events"
else
MESSAGE="Внимание! По адресу $locate; C $whenstart по $whenfin ожидаются работы по $reason"
curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE"
curl -sS "http://{$SERVER}{$SERVER_CMD}idx={$idx}&nvalue=0&svalue={$domoticztext}"
fi
rm /tmp/rosseti
Делаем скрипт исполняемым и добавляем его автоматический запуск раз в день (в полночь)
chmod +x rosseti-alarm.sh
crontab -e
0   0 * * * /home/pi/domoticz/scripts/rosseti-alarm.sh >/dev/null
Информацию о том, как выглядят значения переменных из секции #City info можно посмотреть
cat /tmp/rosseti | grep -o -P '(?<=\<option value\=")(.+?)(?=">)'
arh
vologda
kol
novgorod
pskov
komi
Беломорский район
Калевальский район
Кондопожский район
Лахденпохский район
Лоухский район
Медвежьегорский район
Муезерский район
Олонецкий район
Олонецкое отделение
Питкярантский район
Пряжинский район
Пудожский район
Сегежский район
Сортавальский район
Суоярвский район
Березовые Мосты д
Вехручей
Вилга
Вилга д
Гильд снт
Горки-Шелтозеро
Горное Шелтозеро
Другая Река
.....
результатом будет перечисление значений subject, district, settlement, street.
Как видите, имена subject и street на английском, а district и sattlement на русском. Между русскими словами в названии района или улицы ставим "+"
Читаем о том, как создать бота в телеграме и отправлять ему сообщения если вы ещё этого не делали и  проверяем, что сообщения вообще отправляются.

Кому-то будет удобнее просто добавить событие в гугл-календарь о будущих работах.
Сам скрипт кладём в папку с python-скриптами для работы с гугл-календарём. Как это всё настроить - написал тут. Скрипт для создания события на питоне
nano domoticz/scripts/python/google-calendar-python-api/create_event-rosseti.py
from datetime import datetime, timedelta
from cal_setup import get_calendar_service
import os

def main():
    # Создание события по времени из bash-скрипта
    service = get_calendar_service()

    start = os.environ['pwhenstart']
    end = os.environ['pwhenfin']
    location = os.environ['locate']
    desc = os.environ['reason']
    d = datetime.now().date()
    tomorrow = datetime(d.year, d.month, d.day, 10)+timedelta(days=1)

    event_result = service.events().insert(calendarId='primary',
        body={
            "summary": 'Россети! В Пиндуши будут проводиться работы на линии',
            "description": 'Подробности https://clients.mrsksevzap.ru/poweroutage',
            "start": {"dateTime": start, "timeZone": 'Europe/Moscow'},
            "end": {"dateTime": end, "timeZone": 'Europe/Moscow'},
        }
    ).execute()

    print("created event")
    print("id: ", event_result['id'])
    print("summary: ", event_result['summary'])
    print("starts at: ", event_result['start']['dateTime'])
    print("ends at: ", event_result['end']['dateTime'])
if __name__ == '__main__':
    main()
И скрипт для проверки новых событий на сайте МРСК
nano /home/pi/domoticz/scripts/python/google-calendar-python-api/create_event-rosseti.py
#!/bin/bash

# Check info from https://clients.mrsksevzap.ru/poweroutage

# Domoticz Configuration
SERVER='localhost:443/'
SERVER_CMD='json.htm?type=command&param=udevice&'
SERVER_RID='json.htm?type=devices&'
idx='116'

# Date misc (add sec and timezone)
ddd=":00+03:00"

# City info
subject='karel'
district='Медвежьегорский+район'
settlement='Пиндуши'
street='all'
events=$(curl "https://clients.mrsksevzap.ru/poweroutage?search=true&affil=&outage-type=all&subject={$subject}&district={$district}&settlement={$settlement}&street={$street}&startFrom=&startTo=" --compressed --insecure --silent > /tmp/rosseti-pind)

# Parse
last_event=$(cat /tmp/rosseti-pind | grep "" | grep -o -P '(?<=\
)(.+?)(?=<\/td>)' | head -n 8)
export locate=$(echo "$last_event" | sed -n '1,2p' | tr '\n' ' ')
whenstart=$(echo "$last_event" | sed -n '3,4p' | tr '\n' ' ' | xargs echo -n)
whenfin=$(echo "$last_event" | sed -n '5,6p' | tr '\n' ' ' | xargs echo -n)
export reason=$(echo "$last_event" | sed -n '7,8p' | tr '\n' ' ')
# Share vars with python
export pwhenstart=$(echo "$whenstart$ddd" | awk -F" "  '{print $1}''{print $2 >"/tmp/out1"}' | awk -v FS="." -v OFS=-  '{print $3,$2,$1}' | cat  - /tmp/out1 | tr '\n' ' ' | xargs echo -n | tr ' ' 'T')
export pwhenfin=$(echo "$whenfin$ddd" | awk -F" "  '{print $1}''{print $2 >"/tmp/out2"}' | awk -v FS="." -v OFS=-  '{print $3,$2,$1}' | cat  - /tmp/out2 | tr '\n' ' ' | xargs echo -n | tr ' ' 'T')
# Send data to Domoticz
domoticztext=$(echo "$whenstart по $whenfin $reason" | sed 's/ /%20/g')
curr_state=$(curl -sS "http://{$SERVER}{$SERVER_RID}rid={$idx}" | grep Data | grep -o -P '(?<=: ")(.+?)(?=")' | sed 's/ /%20/g')
if [[ "$domoticztext" == "$curr_state" ]]; then
echo "No new events"
else
python /home/pi/domoticz/scripts/python/google-calendar-python-api/create_event-rosseti.py
fi
rm /tmp/rosseti-pind

UPD!!! Опытным путём, удалось определить, что Россети не соблюдают свои же правила, и выкладывают уведомления на сайт позже чем на доску объявлений в каком-нибудь магазине. Последний раз, когда скрипт уведомил меня о работах с 13:00 до 17:00, crontab сработал в 12 часов, у меня был час, чтобы приготовиться. Но я не читал сообщение, думал что работы будут "на днях" и проигнорировал сообщение. Короче, скрипт надо запускать каждый час, малинка не развалится его запускать. 

Комментариев нет :

Отправить комментарий