Prosty skrypt pobierający dane za pomocą JSONa z Domoticza i wyświetlający je na wyświetlaczu 16×2 hd44780 na GPIO.

EDIT: Adafruit zmienił biblioteki i ten tutorial może być  już nieaktualny

Jak to działa

Domoticz zapisuje dane z czujników. Następnie zapisane dane pobieramy i parasujemy za pomocą JSONa. Później nasza pętla pobiera dane i rotatuje dane w górnym rzędzie wyświetlacza, w dolnym natomiast mamy datę oraz godzinę – możemy oczywiście to zmienić. Po 15 sekundach kolejna pobrana informacja zostanie wyświetlona w górnym rzędzie na wyświetlaczu.

Jak to zainstalować

Kiedy mamy już zainstalowany nasz Domoticz oraz podpięte i skonfigurowane czujniki, to czas zabrać się za nasz wyświetlacz. Najszybsza metodą będzie pobranie i skonfigurowanie sobie swojego wyświetlacza pod tutorial z adafruit. Uwaga! W Tutorialu przy testowaniu przy pinach zasugerowali Raspberry pi 2, jednak chodzi o wersje większe od B oraz B, czyli na Raspberry Pi B, B+ (nie wiem jak z Raspberry pi 2, prawdopodobnie tak samo) trzeba zmienić pin z 21 na 27.

Myślę, że większych problemów z konfiguracją oraz uruchomieniem skryptu nie było.

Teraz możemy dostać się ponownie do naszego skryptu, nazwać go można różnie. Domyślnie to Adafruit_CharLCD_IPclock_example.py

sudo nano Adafruit_CharLCD_IPclock_example.py 

I wstawiamy taki o to kod:

#!/usr/bin/python

from Adafruit_CharLCD import Adafruit_CharLCD
from subprocess import *
from time import sleep, strftime, time
from datetime import datetime
import RPi.GPIO as GPIO
import json
import urllib2

GPIO.setmode(GPIO.BCM)
GPIO.setup(13,GPIO.IN)

lcd = Adafruit_CharLCD()

lcd.begin(16, 1)

i=0

#poprawny adres do parasu
def json_url(id):
    output  = urllib2.urlopen('http://localhost:8080/json.htm?type=devices&rid=%s' % (id))
    return output

#pobieranie konkretnych danych
def show_data(idu, type):
        data = json.load(json_url(idu))
        show = data["result"][0][type]
        return show

#Wyswietlanie prognozy na podstawie BMP085
def showf_room(idu):
        data_room = json.load(json_url(idu))
    for post in data_room["result"]:
        if post.get('Forecast'):
            showf_room = data_room["result"][0]["Forecast"]
        else:
            showf_room = 0

    if showf_room == 0:
        info = "Brak prognozy"
    elif showf_room == 1:
        info = "Prog: slonecznie"
    elif showf_room == 2:
        info = "Czesc. pochmurnie"
    elif showf_room == 3:
        info = "Prog: pochmurnie"
    elif showf_room == 4:
        info = "Bedzie padac :("
    else:
        info = "Brak danych"
        return info

#petelka
while 1:
    
    lcd.clear()

    if i == 0:
       lcd.message('Na zew.  %s' % (show_data(13, "Temp")) +chr(223) + 'C' )
       i=i+1
       sleep(0.5)
    elif i == 1:    
       lcd.message('Cisn %s' % (show_data(10, "Barometer")) + ' hPa')
       i=i+1
        sleep(0.5)
    elif i == 2:
        lcd.message(showf_room(10))
        i=i+1
        sleep(0.5)
    else:
       lcd.message('W pokoju %s' % (show_data(10, "Temp")) +chr(223) + 'C' )
        i=0
       sleep(0.5)

    for x in range(15):
       lcd.message(datetime.now().strftime('\n%b %d  %H:%M:%S\n'))
       sleep(1)

Konfiguracja

Dla bardziej zaciętych polecam lekturę, jednak lepiej jeśli krótko wyjaśnię jak wygląda konfiguracja.

Logujemy się do naszego Domoticza i przechodzimy do działu urządzenia. Widzimy urządzenia. w drugiej kolumnie naszej tabeli pojawia się ID naszych czujników. Teraz musimy przejść pod adres http://IP Domoticza:8080/json.htm?type=devices&rid=X – gdzie X będzie ID naszego czujnika np. temperatury.

Wyświetli nam się Array np.


{ "5MinuteHistoryDays" : 1, "ActTime" : 1427052049, "AllowWidgetOrdering" : true, "DashboardType" : 0, "Latitude" : "51.543922", "Longitude" : "20.009509", "MobileType" : 0, "TempScale" : 1.0, "TempSign" : "C", "WindScale" : 1.0, "WindSign" : "m/s", "dontcachehtml" : true, "result" : [ { "AddjMulti" : 1.0, "AddjValue" : 0.0, "BatteryLevel" : 100, "CustomImage" : 0, "Data" : "-2.1 C", "Favorite" : 1, "HardwareID" : 7, "HardwareName" : "DS18B20", "HaveTimeout" : false, "ID" : "65424", "LastUpdate" : "2015-03-22 20:20:19", "Name" : "Temp zewnetrzna", "Notifications" : "false", "PlanID" : "0", "Protected" : false, "ShowNotifications" : true, "SignalLevel" : 12, "SubType" : "TFA 30.3133", "Temp" : -2.10, "Timers" : "false", "Type" : "Temp", "TypeImg" : "temperature", "Unit" : 144, "Used" : 1, "XOffset" : "0", "YOffset" : "0", "idx" : "13" } ], "status" : "OK", "title" : "Devices" }

teraz odszukujemy konkretną daną np. temperaturę. w tym przypadku będzie prosto, wiemy, że temperatura zewnętrzna to -2.1 stopnia. Znajdujemy naszą zmienną i widzimy, że stoi przy kluczu “Temp” – wielkość liter jest ważna.

Wywołujemy dane.

lcd.message('W pokoju %s' % (show_data(10, "Temp")) +chr(223) + 'C' )

funkcja show_data(IDX naszego czujnika, “Klucz array”) – przykład wyżej.

Jeśli chcemy dodać kolejne wiadomości, które chcemy wyświetlić dodajemy następną opcję elif i zmieniamy i o jeden wyżej np.


elif i == 3:
lcd.message('NO ELO')
i=i+1
sleep(0.5)

Napisałem obsługę dla prognozy pogody na podstawie BMP085. Wyświetlanie prognozy wywołuje się za pomocą showf_room(IDX naszego czujnika).

Możemy zmienić czas rotatora zmieniając liczbę 15 w funkcji range.

for x in range(15):

Myślę, że niedługo dodam jakieś dodatkowe opcję. W kodzie powyżej są użyte przykłady.

Już niedługo więcej w temacie domoticz. Jeśli pojawi się potrzeba, abym dokładniej opisał jak skonfigurować domoticz czy podłączyć czujniki, to piszcie komentarze.

Inne zastosowanie dla wyświetlacza możecie poczytać na MalinowePi.