Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

суббота, 14 ноября 2020 г.

Простой ICMP мониторинг на Python c сохранением данных в БД для Grafana.


Появилась задача помониторить внешние ресурсы на доступность простым ICMP опросом. Но данное решение как вы понимаете подойдет и для решения мониторинга узлов внутренней сети, короче говоря всего, что вы можете попинговать :) 

У меня уже была поднята Grafana и influxdb - эта база данных идеально подходит для сбора и хранения подобных данных. Основным назначением является хранение больших объемов данных с метками времени.

И нам осталось только написать скрипт который будет опрашивать данные, и записывать их в БД. А настройки графаны для вывода графиков буду интуитивно понятны.


Для поддержания скрипта в постоянно рабочем состоянии я использую демон  supervisorctl, но если уверены в стабильности вашей системы можно просто в screen запускать, тут уж на ваш вкус.

Сам скрипт таков:

from ping3 import ping, verbose_ping
from influxdb import InfluxDBClient
import datetime                                                                                                                                                                                                                                 

host='localhost'
port=8086 
user='ping'                                                                                                            
password='ping'
dbname='pingdb'
client = InfluxDBClient(host, port, user, password, dbname)
  servers = ['yandex.ru''vk.com''yota.ru''instagram.com''ok.ru']

def pingserver(server):
    try:
        return ping(server)*1000
    except:
        return 0.0


while True:

    now = datetime.datetime.now()

    for server in servers:
        pingdata = [{
            "measurement""obit",
            "tags": {
                "host": server,
            },
            "time": now.strftime("%Y-%m-%d %H:%M:%S"),
            "fields": {
            "ping": pingserver(server)
            }
        }]
        print(pingdata)
        client.write_points(pingdata)


пятница, 10 мая 2019 г.

Метеостанция на nodemcu (ESP8266).

Кратко опишу процесс создания метеостанции подключенной к narodmon.ru.

Один из самый дешевых модулей ESP8266.
Герметичный температурный датчик DS1820.

Заливаем micropython на нашу плату. Для этого подключаем плату через usb кабель к компьютеру(все действия я провожу в linux), в выводе dmesg видем, что устройство приаттачено к ttyUSB0:



Если не еще не установленна тулза для работы с платой, устанавливаем:

$ pip install esptool 
  подробней тут 

Загружаем дистрибутив micropython: Firmware for ESP8266 boards,
на момент написания статьи стабильная актуальная версия была esp8266-20190125-v1.10.bin

При необходимости затираем память нашей платы:

$ sudo  esptool.py --port /dev/ttyUSB0 erase_flash

и записываем микропайтон:

$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20190125-v1.10.bin

Подключаемся к плате:

$ sudo picocom /dev/ttyUSB0 -b115200

узнаем макадрес устройства, позже его введем в переменную client_id:


import network
import ubinascii
ubinascii.hexlify(network.WLAN().config('mac'),':').decode() 

Включаем WebREPL(необходим для заливки скриптов), не буду описывать весь процесс, вот тут всё хорошо показано: https://learn.adafruit.com/micropython-basics-esp8266-webrepl/access-webrepl

Регистрируетесь на narodmon.ru

Пишем скрипт:


import time
import network
import onewire
import ds18x20
from umqtt.simple import MQTTClient

num = 1
while num < 10:
    sta_if = network.WLAN(network.STA_IF)
    sta_if.active(True)
    sta_if.connect('ВАША_WIFI_СЕТЬ', 'ПАРОЛЬ')
    while not sta_if.isconnected():
        pass

    client=MQTTClient(client_id='12:34:56:78:90:12', server='narodmon.ru', port=1883, user='ПОЛЬЗОВАТЕЛЬНАРОДМОН', password='ПАРОЛЬНАРОДМОН')
    client.connect()

    ow=onewire.OneWire(machine.Pin(12))
    ds=ds18x20.DS18X20(ow)
    roms=ds.scan()
    ds.convert_temp()
    time.sleep_ms(750)
    temperature=ds.read_temp(roms[0])


    client.publish('ВАШНИКНЕЙМ/НАЗВАНИЕДАТЧИКА/temperature', str(temperature))

    time.sleep(10)
    sta_if.disconnect()
    time.sleep(360)

Сохраняем в файл с именем main.py (именно файл с таким названием будет выполняться каждый раз при загрузке устройства).

Подключаемся по wifi к плате и через webrepl заливаем на него наш файл. Теперь когда вы подключитесь к плате по USB, чтобы работать с командной строкой интерпритатора не забудьте нажать ctrl+c, чтобы прервать бесконечный цикл скрипта main.py

Подключаем температурный датчик к плате:


 для получения данных использую пин D6, питание с пина 3V3, земля GND.
Имейте ввиду в данной плате нет RTC и поэтому советы типа отправлять плату в deep sleep для нее не актуальны, необходимо использовать внешний модуль RTC иначе плата просто не проснется. 

В двух словах как-то так. Есть вопросы? Спрашивайте в телеге https://t.me/mimokrokodil