Arduino, ESP8266 Lua, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. chibis

    chibis Нерд

    И остался не приятный осадок. Электроэнергию у всех отключают время от времени.
    И потом сидеть пару часов с танцем с бубном чинить как-то не очень..
    Не, я прекрасно понимаю все данные на флешке и грузится все с нее, но все же...
     
  2. ИгорьК

    ИгорьК Гуру

    Делайте копию. Тем же, чем пишете систему при установке: Win32disk...
     
  3. chibis

    chibis Нерд

    Я честно сказать хотел сразу еще при установке опенхаба сделать, но пока настраивал. Устал и не стал делать и благополучно забыл.
    Сейчас то скопировал файлы опенхаба, а остальное не особо важно. Если что-то не так будет работать точно буду полностью все переустанавливать.
    И на домен малинку тоже вывел. Добрые люди помогли, сам еще даже не особо разбирался в реализации.

    Осталось разобраться с дублированным копированием данных с датчиков на mysql. Для эксопрта данных в эксель или еще куда-нибудь.

    И да.. Бэкапы - наше все.
    Со сервера своего в сети каждую неделю копирую бэкап на компьютер
     
  4. Securbond

    Securbond Гуру

    Что то давно не вносил вклад в данную ветку !
    41. Добавим температуру CPU,GPU Raspberry в Опенхаб.

    1. Для начала добавим файлик: milli.js в папку: /etc/openhab/configurations/transform
    в файлике пишем:
    (function(i){ return i / 1000; })(input) Сохраняем, закрываем.

    2. Добавим итемы идем сюда: /etc/openhab/configurations/items
    создаем файлик: system.items
    в файлик пишем:
    Код (Text):
    // System temperatures

    Group System_Temperature_Chart (System, Charts)
    Number System_Temperature_Chart_Period "Periode" (System)
    Number System_Temperature_CPU "Temperature CPU [%.1f °C]" <temperature> (System_Temperature_Chart) { exec="<[cat /sys/class/thermal/thermal_zone0/temp:60000:JS(milli.js)]" }
    Number System_Temperature_GPU "Temperature GPU [%.1f °C]" <temperature> (System_Temperature_Chart) { exec="<[/opt/vc/bin/vcgencmd measure_temp:60000:REGEX(temp=(.*?)'C)]" }

    Сохраняем, закрываем.

    3. Сохраним данные для графиков. Идем сюда: /etc/openhab/configurations/persistence
    и в файлик: rrd4j.persist добавляем

    System_Temperature_Chart* : strategy = everyChange, everyMinute, restoreOnStartup

    Сохраняем, закрываем.

    4.Осталось добавить итемы и графики в sitemaps...
    Код (Text):
    Frame {
            Text item=System_Temperature_CPU label="Temperature [%.1f °C]" {
                Frame {
                    Text item=System_Temperature_CPU    
                    Text item=System_Temperature_GPU    
                }
                Frame {
                    Switch item=System_Temperature_Chart_Period mappings=[0="1h", 1="4h", 2="8h", 3="12h", 4="24h"]    
                    Chart item=System_Temperature_Chart period=h refresh=60000 visibility=[System_Temperature_Chart_Period==0, System_Temperature_Chart_Period==Uninitialized]    
                    Chart item=System_Temperature_Chart period=4h refresh=60000 visibility=[System_Temperature_Chart_Period==1]    
                    Chart item=System_Temperature_Chart period=8h refresh=60000 visibility=[System_Temperature_Chart_Period==2]    
                    Chart item=System_Temperature_Chart period=12h refresh=60000 visibility=[System_Temperature_Chart_Period==3]    
                    Chart item=System_Temperature_Chart period=D refresh=60000 visibility=[System_Temperature_Chart_Period==4]    
                }
            }
        }
     
    Сохраняем, закрываем. Перезагружаем OH или всю малину.

    ИТОГО:
    temp1.JPG temp2.JPG

    P/S: Что бы все это работало у опенхаба должны быть права root и у Вас должен быть установлен аддон -org.openhab.persistence.rrd4j
    и
    org.openhab.binding.exec
     
    Последнее редактирование: 4 дек 2016
    ИгорьК и alp69 нравится это.
  5. alp69

    alp69 Форумчанин

    А реакция на перегрев будет? Типа "Хозяин! Мне жарко! Включаю кулер!";)
     
  6. Securbond

    Securbond Гуру

    Лучше уж тогда пусть сообщение в телеграм шлет "Дорогой я вся горю!!!, твоя Raspberry". Вот жена удивится если прочитает:D

    Можно и так... но моя за год работы пока и без куллеров справляется :)... тьфу тьфу тьфу...
     
  7. alp69

    alp69 Форумчанин

     
  8. alp69

    alp69 Форумчанин

    А у меня похоже удаленная RPi3 сдохла. Или SD-карточка.
    Пропала из списка DHCP-клиентов.
     
  9. ИгорьК

    ИгорьК Гуру

    Номерок там 41 будет :) Добавил в заголовок.
     
  10. ip-ua

    ip-ua Нерд

    Для бекапов малины самый быстрый и надежный вариант:
    https://github.com/billw2/rpi-clone
    Бекап делает на СД карту вставленую в СДридер в ЮСБ порт.
    При этом:
    1) время копирования ОЧЕНЬ малое ( у меня занято 2 ГБ - делает на новую карту полный бекап за 5 минут),
    2) с бекапной карты можно сразу грузиться как с оригинала - т.е. это полная копия.
    3) можно делать и полный и инкрементный бекап.
    Размер СД карты для бекапа значения не имеет - лишь бы была больше, чем объем данных на основной карте.
     
    chibis и ИгорьК нравится это.
  11. chibis

    chibis Нерд

    Люди добрые. Подскажите как сделать график более подробным точнее добавить сетку с данными?
    У меня как на первом скрине.
    В сети выдел на скринах более подробный график как если бы вызывать график по ссылке. Мне в браузере нужен такой же как на втором скрине
     

    Вложения:

    • temp.jpg
      temp.jpg
      Размер файла:
      109,7 КБ
      Просмотров:
      507
    • charts.png
      charts.png
      Размер файла:
      82,7 КБ
      Просмотров:
      451
  12. ИгорьК

    ИгорьК Гуру

    Полагаю, второй график получен не стандартными средствами ОН, а путем сохранения потока данных в какую нибудь популярную базу типа MySql и выборкой специализированным ПО, коих пруд пруди.
    Чтобы выгнать данные нужно изучить https://github.com/openhab/openhab/wiki/MySQL-Persistence а чтобы построить таблицу - что сами найдете, по вкусу.
    Пример здесь: http://forum.amperka.ru/threads/esp8266-графический-термометр-и-графики-данных-для-странички.4625/
     
    chibis нравится это.
  13. chibis

    chibis Нерд

    Игорь, спасибо за ссылки. Ваши наработки очень интересны!

    MySQL пока не хочу поднимать на малине. Планы другие сохранять данные в базу данных на сервер в сети минуя милинку. Изучаю по мере возможности это направление.
     
    Последнее редактирование: 5 ноя 2016
  14. Securbond

    Securbond Гуру

    Доброй ночи, кто нибудь пробовал посылать данные в mqtt питоновским скриптом ?
     
  15. ИгорьК

    ИгорьК Гуру

    Как это делать - зависит от базы. Обычно к базе лепится страничка на php и post/get запросом данные втыкаются в базу.
     
  16. Securbond

    Securbond Гуру

    42. RasPi + DHT + OpenHab

    А что это наша малина имея столько пинов изображает из себя сервер ?
    Давайте прикрутим к ней какой нибудь DHT или AM2302 пусть меряет температуру в том помещении где находится !

    1. Для реализации сего чуда, нужно получить доступ к малиновым gpio, на всякий случай пишем:
    sudo apt-get install python-rpi.gpio
    2. Нужна библиотека для работы с DHT. (Adafruit- наше всё). Ставим:
    Код (Text):

    cd ~
    git clone https://github.com/adafruit/Adafruit_Python_DHT.git
    cd Adafruit_Python_DHT
    sudo apt-get update
    sudo apt-get install build-essential python-dev
    sudo python setup.py install

    sudo reboot
     
    3. Нам нужно два скрипта один будет забирать температуру, второй влажность.
    (т.к я в программировании лузер, то заставить одним скриптом забирать данные и распихивать их в разные итемы мне ума не хватило. По этому сделал как смог)

    Первый скрипт /home/pi DHTtemp.py

    Код (Text):
    #!/usr/bin/python

    import sys

    import Adafruit_DHT

    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 4)
    if humidity is not None and temperature is not None:
         print(temperature)
    else:
        print('Failed to get reading. Try again!')
        sys.exit(1)
     
    Обратите внимание !!! (Adafruit_DHT.AM2302, 4)
    тут мы видим 2 параметра Adafruit_DHT.AM2302 если у вас датчик DHT11 или DHT22 то замените на Adafruit_DHT.DHT11 или Adafruit_DHT.DHT22 соответственно.
    и второй параметр 4 - это номер gpio к которому подключен датчик.

    Второй скрипт аналогичный, только для влажности /home/pi DHThum.py

    Код (Text):

    #!/usr/bin/python

    import sys

    import Adafruit_DHT

    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 4)
    if humidity is not None and temperature is not None:
         print(humidity)
    else:
        print('Failed to get reading. Try again!')
        sys.exit(1)
     

    Не забывайте, пользователь под которым работает ОН, должен иметь привелегии на запуск данных скриптов!!!

    4. Остались итемы:
    Код (Text):
    Number BedRoom_hum "Влажность в спальне [%.2f %%]" <humimi> { exec="<[python /home/pi/DHThum.py:50000:REGEX(Humidity=(.*?)%)]" }
    Number BedRoom_temp "Температура в спальне [%.2f °C]" <temperature> { exec="<[python /home/pi/DHTtemp.py:60000:REGEX((.*?))]" }
     
    и сайтмеп:
    Код (Text):
    Frame {
            Text item=BedRoom_temp
            Text item=BedRoom_hum                    
        }
    bad.JPG
     
    Последнее редактирование: 6 ноя 2016
    ИгорьК нравится это.
  17. ИгорьК

    ИгорьК Гуру

    Вынесу в заголовок. Но сам делать не буду: забыл где малина спрятана :)
     
    alp69 нравится это.
  18. Securbond

    Securbond Гуру

    42.2 RasPi + DHT + MQTT + Openhab

    Хочу дополнить свой предыдущий пост. Для удобства использования сторонних приложений, типа всяких Dashboard, не мешало бы поместить температуру в MQTT. Для этого нужно доустановить пакет paho-mqtt (инструкций в интернете хватает).

    1. Теперь необходим скрипт 123.py для получения данных и отправки их в брокер
    Код (Text):
    #!/usr/bin/python
    # Import package
    import paho.mqtt.publish as publish
    import sys
    import Adafruit_DHT

    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 4)
    if humidity is not None and temperature is not None:
        print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
    else:
        print('Failed to get reading. Try again!')
        sys.exit(1)

    MQTT_TOPIC1 = "badroom/temp"
    MQTT_TOPIC2 = "badroom/hum"
    MQTT_MSG1 = temperature
    MQTT_MSG2 = humidity

    def main():
        msgs = [{'topic': MQTT_TOPIC1, 'payload': MQTT_MSG1},
                {'topic': MQTT_TOPIC2, 'payload': MQTT_MSG2}]

        publish.multiple(msgs, hostname="localhost", port=1883, client_id="badroom", keepalive=60)

    if __name__ == "__main__":
        main()
    Думаю тут всё предельно понятно.

    2. Я не стал заморачиваться с cron, А просто сделал итем для вызова скрипта из OH. и тут же забираю данные в свои итемы.
    Код (Text):
    // BadRoom

    Number BadRoomMQTT "badroomMQTT []" <temperature> { exec="<[python /home/pi/123.py:10000:REGEX((.*?))]" }

    Number BadRoom_hum "Влажность в спальне [%.2f %%]" <humimi> { mqtt="<[mosquitto:badroom/hum:state:default]" }
    Number BadRoom_temp "Температура в спальне [%.2f °C]" <temperature> { mqtt="<[mosquitto:badroom/temp:state:default]" }
     
    3. Ну и сайтмеп
    Код (Text):
    Frame {
            Text item=BadRoom_temp
            Text item=BadRoom_hum                              
        }    
     
    Последнее редактирование: 6 ноя 2016
  19. chibis

    chibis Нерд

    Дополню.
    У кого выглядит JSON в таком виде:
    Код (Text):
    "sensors":{"dsw1":25.0,"dsw2":27.0 }
    Т.е объект с именем

    В приведенных примерах поправляем имя переменной
    Из примера:
    Код (Text):
    tIn  = tIn + transform("JSONPATH", "$.tIn", json)
    В вашем случаи необходимо прописывать т.е добавлять sensors:
    Код (Text):
    dsw1  = dsw1 + transform("JSONPATH", "$.sensors.dsw1", json)
    dsw2  = dsw2 + transform("JSONPATH", "$.sensors.dsw2", json)
    Радуемся результатом ;)
     
    Последнее редактирование: 7 ноя 2016
    Securbond и ИгорьК нравится это.
  20. dimm71

    dimm71 Нерд

    Всем привет!

    Что то я немного запутался. Пришла сегодня ESP-01 и решил я с ней немного поиграться. Попробовал залить прошивку NodeMCU через конструктор, но почему то она не завелась. Все прошилось, но сыпался без остановки какой то мусор в ESplorer. Нашел на просторах интернета какую то старенькую 0.9.6 залил и всё завелось. Закинул скрипт подключения по WiFi - к роутеру конектится.
    Взял здесь из примеров скрипты включения лампочки - залил.

    Немного порезанный (без кнопки)
    Код (C++):
    gpio.mode(4,gpio.OUTPUT)
    gpio.write(4,gpio.LOW)

    Broker="www.*****.ru"
    port=1883
    myClient="ESPSwitch"
    iogin="********"
    pass="**********"

    m = mqtt.Client(myClient, 180, iogin, pass)
    m:lwt("/lwt", "ESPSwitch", 0, 0)
    m:on("offline", function(con)
      print ("reconnecting...")
      tmr.alarm(1, 120000, 1, function()
      m:connect(Broker, port, 0, function()
      tmr.stop(1)
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed!")
      end)
      end)
      collectgarbage()
      end)
    end)
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON") then
      print("Enabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/myhome/lamp01/state","ON",0,0)
      elseif (data=="OFF") then
      print("Disabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/myhome/lamp01/state","OFF",0,0)
      else
      print("Invalid - Ignoring")
      end
      collectgarbage()
    end)

    tmr.alarm(0, 1000, 1, function()
    if wifi.sta.status() == 5 then
      tmr.stop(0)
      m:connect(Broker, port, 0, function(conn)
      print("connected")
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed")
      end)
      end)
    end
    end)
     
    и
    Код (C++):
    do
    FileToExecute="thermoHab.lua"
    l = file.list()
    for k,v in pairs(l) do
      if k == FileToExecute then
        print("*** You have got 20 sec to stop timer 0 ***")
        print("*******    Execute: tmr.stop(0)    *******")
        tmr.alarm(0, 20000, 0, function()
          print("Executing ".. FileToExecute)
          dofile(FileToExecute)
        end)
      end
    end
    end
     
    И все вроде заработало, но с точностью да наоборот. При включении через веб интерфейс напряжение на ноге GPIO2 пропадает, при выключении - появляется.
    В каком месте и что поменять, чтобы исправить?

    И ещё вопрос (не нашел к сожалению ответа), как настроить параллельно чтобы был режим точки доступа, чтобы можно было подключиться к ней со смартфона и выбрать другую WiFi сеть для изменения и вбить пароль. Понимаю, что http сервер нужно поднимать, но что то примеров не нашел.