[Железо] Данные с погодной станции Netatmo через MQTT

Работа с конкретным оборудованием

Модераторы: immortal, newz20

Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

[Железо] Данные с погодной станции Netatmo через MQTT

Сообщение alx69 » Чт фев 09, 2017 1:22 pm

Предисловие и что хочется:
За долго до начала использования Majordomo и всяких Ардуин покупал и ставил себе разные погодные станции и другие приспособления, чтобы хоть как-то автоматизировать и сделать умным дом. В итоге купил погодную станцию Netatmo. Потом докупил к ней еще один внутренний модуль для второй комнаты. но с началом изучения majordomo встал вопрос - как бы сделать так, чтобы подвязать все существующие железки в систему много дома. Перерыл форум, но подключения netatmo к мажордоме там и не нашел. Перерыл кучу сайтов, нашел библиотеки на

Смотри ниже модификацию скрипта и описание без использования MQTT. Update от 12.05.2020


Python и решил скрестить это все через протокол MQTT.

Имеем:
Raspberry PI 3 (в данном случае все равно какая версия). Т.к. именно на этом решении проще и удобней было сделать сервер умного дома.
Netatmo: погодная станция с несколькими модулями - спальня, детская, улица.

Решение:
Raspberry, Netatmo - понятное дело, что оба в общей домашней сети (один через ethernet, второй через wifi - в данном случае не важно, что куда воткнуто).
Для подключения нужен сам MQTT брокер. У меня стоит mosquitto, но не важно какой, может быть и другим. Python. Библиотеки для Python нужны от MQTT брокера и для Netatmo (https://github.com/philippelt/netatmo-api-python).
Саму питоновскую библиотеку лучше поставить в систему (в директории с библиотекой указанной выше сделать: pip install lnetatmo)

Вот скрипт для получения данных со станции и публикация их через MQTT. Все достаточно просто и комментариями расписал все стадии:
СпойлерПоказать

Код: Выделить всё

#!/usr/bin/python
# coding=utf-8

import sys
import paho.mqtt.client as mosquitto
import time

# https://github.com/philippelt/netatmo-api-python
import lnetatmo

# IP/localhost сервера MQTT брокера (если он установлено локально, то оставить localhost)
broker = "localhost"
# Произвольное ммя клиента, которым конектимся к брокеру MQTT
client_name = "NetatmoOverPythonOnRaspPi"
# Начало имени топика для данных с модулей Netatmo
topic_Start = "/fromRaspNetatmo"

# Подключаемся к mosquitto
client = mosquitto.Mosquitto(client_name)
# userdata заполняется если нужна авторизация на MQTT брокере, в противном случае -> коментарим строчку ниже
userdata = client.username_pw_set(username="имя пользователя на mqtt брокере",password="пароль на mqtt брокере")

# Подключаемся к Netatmo
authorization = lnetatmo.ClientAuth(clientId="вставить client id",
                                clientSecret="вставить client secret", username="имя пользователя", password="пароль")

# For each available module in the returned data that should not be older than one hour (3600 s) from now
devList = lnetatmo.WeatherStationData(authorization)
client.connect(broker)

for module, moduleData in devList.lastData(exclude=3600).items() :

    # Топик в MQTT будет для каждого модуля свой
    topic_Middile = topic_Start + "/" + module
    # начитываем данные из Netatmo
    for sensor, value in moduleData.items() :
        # Для понимания дат и вреемни превращаем их в читабельный вид (hh:mm:ss)
        if sensor == "When" : value = time.strftime("%H:%M:%S",time.localtime(value))
        if sensor == "date_max_temp" : value = time.strftime("%H:%M:%S",time.localtime(value))
        if sensor == "date_min_temp" : value = time.strftime("%H:%M:%S",time.localtime(value))
        #print("%30s : %s" % (sensor, value))

        # Собираем топик с сенсором в одно целое для публикации
        topicFull = topic_Middile + "/" + sensor
        valueFull = str(value)
        # Публикуем в MQTT данные сенсора из цикла
        client.publish(topicFull, valueFull ,0)
        #print topicFull + ": " + valueFull

time.sleep(5)
client.disconnect()
Далее записываем это все в крон (cron) с примерно такими параметрами:

Код: Выделить всё

*/5 * * * * /root/bin/Netatmo_on_Rasp2MQTT.py > /dev/null 2>&1
Распишу: раз в 5 минут запускать скрипт. Переназначение через > говорит о том, что все ошибки и прочую лабуду не выводить в те логи, которые пишет сама система.
В случае если в данных majordomo в устройстве MQTT ничего не появляется, то откоментаривайте print'ы и запускайте скрипт вручную, чтобы понять, какие данные он получает от станции и получает ли их вообще.
Сделал НЕ через цикл в самом скрипте, т.к. лень было отлавливать почему иногда скрипт вылетает с ошибкой, т.к. брокер сам закрывает соединение. В данном случае, запуск через крон даже лучше в каком-то смысле, т.к. если скрипт по каким-то причинам "вылетит", то запускать его будет уже не кому и надо обрабатывать как-то этот момент.

Я не описываю тут как именно подключить и установить MQTT брокер к Majordomo - на сайте есть описания этого процесса.

UPD (12.05.2020)
В общем, идеология в корне изменилась. Переписал код так, чтобы он работал внутри Majordomo и не затрагивал вообще MQTT.
Данные разбрасываются по свойствам объектов.

Забыл вверху добавить, что для clientID, clientSecret нужно сперва создать App по адресу https://dev.netatmo.com/

Вот код:

Код: Выделить всё

import sys
import time

# https://github.com/philippelt/netatmo-api-python
import lnetatmo

# Подключаемся к Netatmo
authorization = lnetatmo.ClientAuth(clientId="подставить свой clientID",
                                clientSecret="подставить свой clientSecret", username="свое имя пользователя к станции", password="пароль пользователя к станции")

# For each available module in the returned data that should not be older than one hour (3600 s) from now
devList = lnetatmo.WeatherStationData(authorization)

for module, moduleData in devList.lastData(exclude=3600).items() :

    # Если нужно, то преобразовываем названия комнат, что задали в приложении (при настройке станции), в имена тех объектов, что задали в названии объектов класса
    if module == "Egor" : sg_str = "Kinder_room"
    if module == "Street" : sg_str = "Street_out"
    if module == "Bedroom" : sg_str = "Bed_room"

    # начитываем данные из Netatmo и преобразовываем в названия свойств, что задали.
    # преобразование можно убрать
    for sensor, value in moduleData.items() :
        # Для понимания дат и вреемни превращаем их в читабельный вид (hh:mm:ss)
        if sensor == "When" :
          value = time.strftime("%H:%M:%S",time.localtime(value))
          sensor = "timeOfChange"
        if sensor == "battery_vp" : sensor = "voltage"
        if sensor == "Temperature" : sensor = "temperature"
        if sensor == "Humidity" : sensor = "humidity"
        if sensor == "Pressure" : sensor = "pressure"
        if sensor == "Noise" : sensor = "noise"

        # отбрасываем те свойства, коотрые нам не нужны в Majordomo
        if sensor == "min_temp" : continue
        if sensor == "max_temp" : continue
        if sensor == "temp_trend" : continue
        if sensor == "rf_status" : continue
        if sensor == "date_min_temp" : continue
        if sensor == "date_max_temp" : continue
        if sensor == "wifi_status" : continue
        if sensor == "AbsolutePressure" : continue
        if sensor == "pressure_trend" : continue

        # Собираем топик с сенсором в одно целое для публикации
        topicFull = sg_str + "." + sensor
        valueFull = str(value)

# для отладки
#        print "mjdm.setGlobal(" + topicFull + "," + valueFull +")"
        mjdm.setGlobal(topicFull,valueFull)
По-скольку с недавних пор Majordomo начал поддерживать скрипты на Python, то интеграция заняла на много меньше времени, чем бы было на php ;)

Расписываю подробно:
  1. Нужно доставить библиотеки на систему. Библиотека python-mysqldb для raspbian/debian. В других OS может отличаться. Называется библиотека "Python interface to MySQL". Сергей ее, видимо, забыл описать в топике по скриптам Питона. Без нее ничего не работает.
  2. Библиотеку, которая описана в скрипте "netatmo-api-python" тоже надо поставить - скачать с гитхаба и поставить, как там написано.
  3. Создать класс, например с именем Netatmo
    СпойлерПоказать
    na_01.jpg
    na_01.jpg (9.55 КБ) 5245 просмотров
    в нем создать объекты с теми именами, что дали комнатам при настройке станции на сайте/приложении для смартфона. Если даете другие имена объектам, то тогда нужно делать преобразование имен, которое описано в скрипте выше. В моем варианте, объекты с именами Bed_room, Kinder_room, Street_out, но при этом названия комнтам чуть другие (см. выше в сам скрипт). Если это не нужно, то закоментарьте в скрипте это действие.
  4. Свойства хотите создавайте, хотите нет - они сами создадуться. Но с учетом тех преобразований, что записаны в скрипте. Не хотите такие названия - коментарим и смотрим, что создасться на автомате.
  5. В классе, которые создали (Netatmo например) создаем метод. У меня имя метода "netatmoGetData":
    СпойлерПоказать
    na_04.jpg
    na_04.jpg (33.15 КБ) 5245 просмотров
  6. И последнее, в объекте onNewMinute сласса Time нужно вызывать метод для того, чтобы он забирал данные со станции.
    СпойлерПоказать
    na_02.jpg
    na_02.jpg (4.02 КБ) 5245 просмотров
    na_03.jpg
    na_03.jpg (33.91 КБ) 5245 просмотров
    Обращаю внимание, что скрипт создан так, чтобы вызываться из одного объекта, а не по очередности из всех. Т.е. запись в onNewMinute должна быть одна. Вызываемый там метод может быть из любого из созданных в классе объектов. См. скриншот для примера.
Последний раз редактировалось alx69 Вт май 12, 2020 12:01 pm, всего редактировалось 3 раза.
За это сообщение автора alx69 поблагодарил:
alecseyyy (Вс май 17, 2020 6:57 am)
Рейтинг: 1.16%
erandess
Сообщения: 50
Зарегистрирован: Пт окт 03, 2014 9:04 am
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Re: Данные с погодной станции Netatmo через MQTT

Сообщение erandess » Чт фев 09, 2017 4:21 pm

У Netatmo там же есть API и на PHP https://github.com/Netatmo/Netatmo-API-PHP. При желании можно даже все это в модуль оформить.
Метеостанция достойная, только единственный недостаток - все данные с датчиков гоняются через сервера Netatmo.
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: Данные с погодной станции Netatmo через MQTT

Сообщение alx69 » Пт фев 10, 2017 3:45 pm

При желании-то можно, но нигде тут такого не нашел по поиску. Ни модулем, ни просто расписанием интеграции в мажордомо. Сделал сам. Фактически через тот же API только уже написанный на питоне. Я тоже был удивлен, что до сих пор модуля нет тут. И странно, что до сих пор об этот тут никто не спрашивал - судя по карте в нетатмо, то станция достаточно не плохо распространена на просторах бывшего...
По-скольку, как мне кажется, если на компе стоит мажордома, то стоит и брокер mqtt - проще было на него и завязать данные, так как уже все умеют с ним работать и извлекать из него данные.
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Karn
Сообщения: 1
Зарегистрирован: Вт окт 17, 2017 10:57 am
Благодарил (а): 0
Поблагодарили: 0

Re: Данные с погодной станции Netatmo через MQTT

Сообщение Karn » Ср окт 18, 2017 12:22 am

Недавно настраивал сие сопряжение.

Стоит учесть так как mosquitto питоновое уже не доступно, то в коде нужно его заменить на приемника.

Код: Выделить всё

import paho.mqtt.client as paho # вместо mosquitto

client = paho.Client(client_name) # вместо mosquitto.Mosquitto
И еще, указанный выше код рассчитан на настройки, когда брокер настроен так, что анонимные подключения разрешены, иначе нужно в код скрипта добавлять аутентификацию.
alecseyyy
Сообщения: 24
Зарегистрирован: Пн дек 10, 2018 11:42 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение alecseyyy » Сб май 09, 2020 2:06 pm

Добрый день, что-то не получается сделать по инструкции, возможно что-то уже протухло за 3 года.
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение alx69 » Вс май 10, 2020 11:05 pm

Подправил скрипт в первом сообщении, чтобы была авторизация на MQTT брокере и с учетом новой версии библиотеки.
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение alx69 » Вт май 12, 2020 11:55 am

Полностью переосмыслена идеология.
Выкинута на свалку истории работа с MQTT. Теперь данные поступают в свойства объектов напрямую минуя прокладки в виде MQTT.
Смотри первый пост.
Теоретически, должна быть упрощена работа из-под Windows. Не надо использовать шедулеры для запуска скрипта по расписанию. Хотя поковыряться с либами придется все равно.
За это сообщение автора alx69 поблагодарил:
Denisuk (Ср янв 13, 2021 3:13 pm)
Рейтинг: 1.16%
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Denisuk
Сообщения: 8
Зарегистрирован: Ср янв 13, 2021 10:15 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение Denisuk » Ср янв 13, 2021 3:14 pm

А не подскажете в картинках куда и как класть недостающие библиотеки.
Аватара пользователя
alx69
Сообщения: 122
Зарегистрирован: Чт фев 09, 2017 12:42 pm
Откуда: Киев, Украина
Благодарил (а): 10 раз
Поблагодарили: 22 раза

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение alx69 » Пн янв 18, 2021 9:24 am

Denisuk писал(а):А не подскажете в картинках куда и как класть недостающие библиотеки.
Windows или Linux?

Отправлено с моего Nokia 3310 через Tapatalk

За это сообщение автора alx69 поблагодарил:
Denisuk (Пт янв 22, 2021 12:43 pm)
Рейтинг: 1.16%
Raspberry PI 3, 4 (MicroSD+HDD/SSD) + Netatmo + Xiaomi + Sonoff + Broadlink + Livolo/Funry/Sesoo + Ghome + Irbis (Алиса)
CONNECT
Denisuk
Сообщения: 8
Зарегистрирован: Ср янв 13, 2021 10:15 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: [Железо] Данные с погодной станции Netatmo через MQTT

Сообщение Denisuk » Пт янв 22, 2021 12:43 pm

Windows
Ответить