Last Updated or created 2022-09-26
Having a lot of devices and running a Lab wil use a lot of energy. Now with the energy crisis in Europe, i had to take a closer look at whats using power in my house.
I notished some weird usage patterns while measuring.
I’m using a few shelly power plugs, to measure devices and powerstrips.
With these devices you can control devices connected to it.
On/Off/Timer etcetera.
It wil measure the power usage in watts, and it even got a temperature sensor.
I like the fact that it perfectly integrates into your home automation using an extensive API.
curl commands to controll, and even MQTT messaging. Intergrating in Home Assistant is a breeze.
So i was monitoring a bunch of stuff using Nodered/Grafana/Homeassistant and saw some recurring usage.
But being always late to check things, i made use of my ledserver i’ve build a long time ago.
This ledserver consists of a Raspberry Pi Zero, with a led string and a API written in python.
Below is autostarted on the Raspberry
( I made this ledserver for work, it showed the status of servers and services. Beside that every colleage had a range which he could use for his own scripts. I made some little bash script templates to have led funtions standard in your bash profile.
#!/usr/bin/python # apt-get install python-flask # import Adafruit_WS2801 import Adafruit_GPIO.SPI as SPI import struct from flask import Flask, render_template, request app = Flask(__name__) PIXEL_COUNT = 32 SPI_PORT = 0 SPI_DEVICE = 0 pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE)) pixels.clear() pixels.show() @app.route("/led/<deviceName>/<color>") def action(deviceName, color): if deviceName == 'reset': print ("reset") pixels.clear() print (deviceName) led = int(deviceName) s = color r = int(s[ :2], 16) b = int(s[2:4], 16) g = int(s[4: ], 16) pixels.set_pixel_rgb(led, r,g,b) pixels.show() templateData = { 'rled' : r, 'bled' : b, 'gled' : g, 'deviceName' : deviceName, } return render_template('index.html', **templateData) @app.route("/control/<controlcommand>") def actioncommand(controlcommand): if controlcommand == 'clear': print("clear") pixels.clear() pixels.show() templateData = { 'controlcommand' : controlcommand, } return render_template('index.html', **templateData) @app.route("/range/<start>/<stop>/<color>") def rangecommand(start,stop,color): s = color r = int(s[ :2], 16) b = int(s[2:4], 16) g = int(s[4: ], 16) startled = int(start) stopled = int(stop) while (startled < stopled): pixels.set_pixel_rgb(startled, r,g,b) startled=startled + 1 pixels.show() templateData = { 'rangecommand' : rangecommand, } return render_template('index.html', **templateData) if __name__ == "__main__": app.run(host='0.0.0.0', port=8080, debug=True)
Now you can control the leds with a simple curl command:
curl http://ledserver:8080/range/startled/endled/colorinrgb
curl http://ledserver:8080/led/lednumber/colorinrgb
curl http://ledserver:8080/control/clear
So today i made a little script to show power usage.
I’m reading the current power usage from a LS120 Youless
Youless LS120 device, which you can connect to your P1 connector.
With below bash script i’m reading the webinterface and update the ledstring.
I was using this ledserver for general notification usage. Below a 2 minute hack ..
#!/bin/bash while true; do number=$(echo $(curl -s http://youlessip/a | grep Watt | head -1 | awk '{ print $1 }') / 100 | bc) curl -s http://ledserver:8080/control/clear curl -s http://ledserver:8080/range/00/$number/010101 sleep 10 done