Benutzer-Werkzeuge

Webseiten-Werkzeuge


software:frontends:ledpi

Dies ist eine alte Version des Dokuments!


LEDpi - Visualisierung des Stromverbrauchs / PV Einspeisung per farbiger LEDs

Hardware

Verkabelung / Aufbau

Software

Das PixelPi Script von https://github.com/scottjgibson/PixelPi wurde verschlankt und etwas umgebaut. So ist dieses Python Scripte entstanden. Das Scrpit übernimmt folgende Funktionen:

  • Auslesen der aktuellen Werte aus der Volkszaehler Middleware
  • Anzeigen der Leistung der einzelnen Kanäle in verschiedenen Farben (z.B. PV Leistung in Blau, davon eingespeister Strom in Grün, Verbrauch in Rot) Pro 500Watt wird eine LED voll erleuchtet (SCALE), die letzte dann in entsprechener Helligkeit
  • die oberste LED blinkt grün um zu zeigen das das Script noch lebt
import httplib2 as http
import json
from pprint import pprint
import argparse
import csv
import socket
import time

try:
    from urlparse import urlparse
except ImportError:
    from urllib.parse import urlparse

headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json; charset=UTF-8'
}

targetELW =     urlparse('http://sqlserver/middleware.php/data/f2059450-bbbe-11e3-aabc-7bfab5f4b02e.json?from=now')
targetHeizung = urlparse('http://sqlserver/middleware.php/data/26bce7c0-bbc2-11e3-b634-3334d2c934ae.json?from=now')
targetHaus =    urlparse('http://sqlserver/middleware.php/data/32e8d3d0-bbc2-11e3-8f42-eb76d7115f4b.json?from=now')
targetPV =      urlparse('http://sqlserver/middleware.php/data/4186f3e0-bbc2-11e3-a87a-8b10388c97ce.json?from=now')
gamma = bytearray(256)
spi_dev_name = '/dev/spidev0.0'
PIXEL_SIZE = 3
SCALE = 500
BLACK = bytearray(b'\x00\x00\x00')
BLUE = bytearray(b'\x00\x00\xff')
CYAN = bytearray(b'\x00\xff\xff')
FUCHSIA = bytearray(b'\xff\x00\xff')
GREEN = bytearray(b'\x00\xff\x00')
RED = bytearray(b'\xff\x00\x00')
WHITE = bytearray(b'\xff\xff\xff')
YELLOW = bytearray(b'\xff\xff\x00')

# Apply Gamma Correction and RGB / GRB reordering
# Optionally perform brightness adjustment
def filter_pixel(input_pixel, brightness):
    output_pixel = bytearray(PIXEL_SIZE)
    input_pixel[0] = int(brightness * input_pixel[0])
    input_pixel[1] = int(brightness * input_pixel[1])
    input_pixel[2] = int(brightness * input_pixel[2])
    output_pixel[0] = gamma[input_pixel[0]]
    output_pixel[1] = gamma[input_pixel[1]]
    output_pixel[2] = gamma[input_pixel[2]]
    return output_pixel

def write_stream(pixels):
    spidev.write(pixels)
    return

# MAIN
spidev = file(spi_dev_name, "wb")
for i in range(256):
    gamma[i] = int(pow(float(i) / 255.0, 2.5) * 255.0)
Blinker = 0
pixel_output = bytearray(16 * PIXEL_SIZE + 3)
method = 'GET'
body = ''
h = http.Http()

while True:
   responseELW, contentELW = h.request(targetELW.geturl(),method,body,headers)
   ELW = json.loads(contentELW)
   ELWled = int(float(ELW["data"]["tuples"][0][1])) / SCALE
   responseHeizung, contentHeizung = h.request(targetHeizung.geturl(),method,body,headers)
   Heizung = json.loads(contentHeizung)
   Heizungled = int(float(Heizung["data"]["tuples"][0][1])) / SCALE
   responseHaus, contentHaus = h.request(targetHaus.geturl(),method,body,headers)
   Haus = json.loads(contentHaus)
   Haus["data"]["tuples"][0][1] = Haus["data"]["tuples"][0][1] - ELW["data"]["tuples"][0][1]
   Hausled = int(float(Haus["data"]["tuples"][0][1])) / SCALE
   responsePV, contentPV = h.request(targetPV.geturl(),method,body,headers)
   PV = json.loads(contentPV)
   PVled = int(float(PV["data"]["tuples"][0][1])) / SCALE

   led = 0
   print "Haus: ", int(float(Haus["data"]["tuples"][0][1])), "  Hausled: ",Hausled, "PV: ", int(float(PV["data"]["tuples"][0][1])) , "  PVled ",PVled
   for led in range(19):
        pixel_output[led * PIXEL_SIZE:] = filter_pixel(BLACK, 1)
        if Hausled > led:
                pixel_output[(led * PIXEL_SIZE)+0] = '\xff'
        elif (Hausled == led) and (int(float(Haus["data"]["tuples"][0][1])) > 440):
                pixel_output[(led * PIXEL_SIZE)+0] = int(( float(Haus["data"]["tuples"][0][1]) % SCALE) / SCALE * 255)
        if -Hausled > led:
                pixel_output[(led * PIXEL_SIZE)+1] = '\xff'
        elif (-Hausled == led) and ( int(float(Haus["data"]["tuples"][0][1])) < -440):
                pixel_output[(led * PIXEL_SIZE)+1] = int(( float(Haus["data"]["tuples"][0][1]) % SCALE) / SCALE * 255)

        if (PVled > led) and (PVled > -Hausled) and (PVled > Hausled):
                pixel_output[(led * PIXEL_SIZE)+2] = '\xff'
        elif PVled == led:
                pixel_output[(led * PIXEL_SIZE)+2] = int(( float(PV["data"]["tuples"][0][1]) % SCALE) / SCALE * 255)

        if (led == 18):
                if (Blinker == 0):
                        Blinker = 1
                        pixel_output[led * PIXEL_SIZE:] = filter_pixel( bytearray(b'\x00\x1C\x00'), 1)
                else:
                        Blinker = 0
                        pixel_output[led * PIXEL_SIZE:] = filter_pixel(BLACK, 1)

   for c in pixel_output: print(c),
   print('\n')

   write_stream(pixel_output)
   spidev.flush()
   time.sleep(2)
software/frontends/ledpi.1453117541.txt.gz · Zuletzt geändert: 2016/01/18 12:45 von udo1