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.
A jak wyglądał by skrypt dla wyświetlacza OLED SSD1306?
Trudno mi powiedzieć 🙂 Nie budowałem pod OLED i projekt jest już stary, ale to co jest napisane można wykorzystać, tylko podstawić pod nowe funkcje odpowiedzialne za wyświetlanie. Proszę poszukać samej obsługi wyświetlacza gdzieś na githubie może coś się znajdzie. Jeśli będę miał okazję napisze taki tutorial pod OLEDa
Skleiłem taki oto skrypt pod SSD1306 http://wklejaj.pl/JjwUVjvfagXX ale niestety nic nie wyświetla się, tak jak by nie mógł odczytać wartości z JSON.
Sprawdz czy przy zmianie wartosci image w 125 lini da jakas wartosc jesli tak to sproboj zmienic. Jesli to cos da sproboj dac w linii 104 (i w kazdym kolejnym ifie/elsie podmienic) taka wartosc np. image = draw.(…) 🙂 Nie wiem czy to zadziala, ale moze sie uda.
from lib_oled96 import ssd1306
import time
import sys
import json
import urllib2
from time import sleep
from PIL import ImageFont
from smbus import SMBus
font = ImageFont.load_default()
i2cbus = SMBus(1)
oled = ssd1306(i2cbus)
draw = oled.canvas
i=0
def json_url(id):
output = urllib2.urlopen(’http://192.168.1.119:8080/json.htm?type=devices&rid=22′)
return output
def show_data(idu, type):
data = json.load(json_url(idu))
show = data[„result”][0][type]
return show
while True:
draw.rectangle((0, 0, oled.width-1, oled.height-1), outline=20, fill=0)
font = ImageFont.truetype(’FreeSans.ttf’, 12)
draw.text((0, 0),’Temperatura : %s’ % show_data (15, 'Temp’) , font=font, fill=255)
W czymś tutaj pomóc? 🙂 bo nie bardzo rozumiem