Projekte

Doorbell – Homebridge

Ich hab ja den Pi neu aufgesetzt… da wollte ich Homebridge mal wieder testen. Da fiel mir ein, es wäre doch praktisch wenn man einen Live-Stream hätte…
Gesagt, getan.

Hab das Script angepasst, dass der Video Treiber automatisch geladen wird:

# Camera for Homebridge
cmdCamHomebridge='sudo modprobe bcm2835-v4l2'
subprocess.call(cmdCamHomebridge, shell=True)

Ihr müsst auch euren User (pi), zur video Gruppe hinzufügen:

sudo usermod -a -G video pi

In der HomeKit App musste ich dann den Code (gleicher wie Bridge) manuell hinzufügen. Dann erscheint die Kamera. Nun kann ich bequem vom iPhone oder der Apple Watch meine Haustüre betrachten…

Von |2018-02-18T20:39:06+01:002018-02-19|Doorbell, Projekte|

Doorbell – Installation

Ich hatte schon lang auf meiner Todo-Liste, den Rapsberry 1 gegen 3 zu tauschen. Nehme diesen oft zum Testen her und da ist er schon ziemlich langsam. Nun konnte ich den alten nicht mehr im Netzwerk erreichen, aber er klingelte noch fröhlich. Nach dem Austausch musste ich feststellen dass die PV-Anlage die IP Adresse nicht freigegeben hatte… Warum auch immer… 🤦‍♂️

Natürlich hatte ich ein Backup, aber ich wollte den Pi neu einrichten. Clean-Install ist eh meist die bessere Entscheidung. Darum schreib ich hier kurz eine Notiz an mein Zukunfts-Ich, was alles zu tun ist:

  • raspi-config
    • Sprachen einstellen
    • Hostname einstellen
    • Kamera aktivieren
  • Update/Upgrade OS
  • Kamera LED ausschalten
  • VNC installieren
  • Doorbell
    • Python-Script auf den Desktop
    • slacker  mit pip  installieren
    • Autostart des python scriptes: sudo lxterminal -e python Desktop/doorbell/doorbell.py
Von |2018-02-18T20:26:24+01:002018-02-18|Doorbell, Projekte|

HueRainbowClock

Man hat ja schon gemerkt dass ich gerade mein Büro automatisiere…

Nun hatte ich bereits schon eine Hue Lampe, welche ich über IFTTT gesteuert habe. Diese hat jede Stunde die Farbe gewechselt.
Problem: Auch dann wenn ich nicht im Büro bin.

Somit hab ich mir eine RainbowClock für die Hue in Python geschrieben :^)

Läuft bei mir an wenn der Rechner startet und somit geht mir dann automatisch ein Licht auf.
Und ist es nicht cool zu sagen: “Oh es ist schon Rot, ich sollte mal Pause machen.”

HueRainbowClock on GitHub

Das Script läuft zwar auf meinem Mac, aber die Lampe hängt hinter meinem “Test-Monitor” an dem grad ein Raspberry Pi hängt :^)
Es würde auch auf dem Pi laufen…

#############################################################################
# HueRainbowClock
#############################################################################

import os
import datetime
import time

from phue import Bridge

import colorama
from colorama import Fore, Back, Style

from rgb_cie import Converter

HUEBRIDGEIP = "192.168.178.79"
LIGHTNAME = "Buro"

LAMP = ""

# Executes hour changed
def DingDong():
	global hourBefore

	# Turn lamp on
	LAMP.brightness = 254

	# Change color
	converter = Converter()

	if hour == 1 or hour == 13:
		xy = converter.rgbToCIE1931(255,0,0)

	if hour == 2 or hour == 14:
		xy = converter.rgbToCIE1931(255,128,0)

	if hour == 3 or hour == 15:
		xy = converter.rgbToCIE1931(255,255,0)

	if hour == 4 or hour == 16:
		xy = converter.rgbToCIE1931(128,255,0)

	if hour == 5 or hour == 17:
		xy = converter.rgbToCIE1931(0,255,0)

	if hour == 6 or hour == 18:
		xy = converter.rgbToCIE1931(0,255,128)

	if hour == 7 or hour == 19:
		xy = converter.rgbToCIE1931(0,255,255)

	if hour == 8 or hour == 20:
		xy = converter.rgbToCIE1931(0,128,255)

	if hour == 9 or hour == 21:
		xy = converter.rgbToCIE1931(0,0,255)

	if hour == 10 or hour == 22:
		xy = converter.rgbToCIE1931(128,0,255)

	if hour == 11 or hour == 23:
		xy = converter.rgbToCIE1931(255,0,255)

	if hour == 12 or hour == 24:
		xy = converter.rgbToCIE1931(255,0,128)

	LAMP.xy = xy

	# Log
	text = "==> " + str(hour) + " ==> " + str(xy)
	print(Fore.LIGHTBLUE_EX + text + Style.RESET_ALL)

	# Save for check later
	hourBefore = hour

# Init hue
print(Fore.LIGHTBLUE_EX + 'Init hue' + Style.RESET_ALL)
Bridge = Bridge(HUEBRIDGEIP)
Bridge.connect() # If the app is not registered and the button is not pressed, press the button and call connect() (this only needs to be run a single time)
Bridge.get_api() # Get the bridge state (This returns the full dictionary that you can explore)

# Get a dictionary with the light name as the key
light_names = Bridge.get_light_objects('name')

# Get light object
LAMP = light_names[LIGHTNAME]

# Do it to the end of time
print(Fore.LIGHTBLUE_EX + 'Read time' + Style.RESET_ALL)
hourBefore = ""

while(True):
	# Check time
	now = datetime.datetime.now()
	hour = int(now.strftime("%H"))

	# Test
	#for i in range(1,12):
	#	hour = i
	#	DingDong()
	#	time.sleep(2)

	# Check if already set
	if hour == hourBefore:
		continue # do nothing

	# Doit
	DingDong()

 

Von |2016-10-12T12:54:29+02:002016-10-12|HueRainbowClock, Projekte, Python|

FritzboxOnAir

Wenn man ein Büro für sich alleine hat, kennt man bestimmt die Situation: Man telefoniert gerade und eine andere Person klopft bzw. kommt zur Tür herein.

Aus diesem Grund wollte ich eine “OnAir” Lampe, welche man ja oftmals in Studios sieht. Diese soll anzeigen, dass ich gerade telefoniere.

Habe mir überlegt dass mit einem Raspberry Pi / Arduino zu machen… bin aber dann bei der Recherche darauf gekommen, dass die Hue-Lampen (ohne Farbe) garnicht so teuer sind. Diese kann man auch über eine API steuern.
Danach ist mir eingefallen: Wäre es nicht praktisch wenn bei einem eingehenden & ausgehenden Telefonat gleich die Lautstärke des Macs auf 0 gesetzt wird? Somit braucht man das auch nicht mehr machen…

Auf dem Video sieht hört man schlecht, dass die Musik aus geht, das ist aber der Fall und sooo praktisch :^)

Überlegte mir das in Mono mal zu schreiben, aber das ist immer noch ein graus, wenn man fertige Libraries einsetzen möchte, da diese nicht unter Mono laufen. Dann müsste ich den CallMonitor der Fritzbox neu schreiben, wie auch die C# Hue API. Das macht aber keinen Spaß.

Auf der Suche nach fertigen APIs bin ich bei Python hängengeblieben. Bin da zwar nicht so fit, aber kann doch nicht schaden. Und es war einfacher als gedacht, mit ein paar Zeilen Code und diesen Libraries, war das Projekt getan:

FritzboxOnAir on GitHub

#############################################################################
# FritzboxOnAir
#############################################################################

import os
from call_monitor import callmonitor
from phue import Bridge

import colorama
from colorama import Fore, Back, Style

HUEBRIDGEIP = "192.168.178.79"
LIGHTNAME = "OnAir"
PHONENUMBER = "9767518"
Volume = "" # todo: volumne only saved once (on startup)

# Reads the system volume to set it after call back to the value
def readVolume():
    v = os.popen('volume-osx')
    return v.read()

# Executes if calling
def Calling():
    print(Back.GREEN + 'Calling' + Style.RESET_ALL)
    Volume = readVolume() # for later
    os.system("volume-osx 0") # mute system volume
    Bridge.set_light(LIGHTNAME,'on', True) # turn light on

# Executes if no calling
def Sleeping():
    print(Back.CYAN + 'Sleeping' + Style.RESET_ALL)
    os.system("volume-osx " + Volume) # set to old value
    Bridge.set_light(LIGHTNAME,'on', False) # turn light off

# Get event from fritzbox
def callBack (self, id, action, details):
    print("Call: " + str(id) + " - " + action)
    print(details)

    # Check if the phonenumber is is in details
    if ("'to': '" + PHONENUMBER + "'" in str(details) or "'from': '" + PHONENUMBER + "'" in str(details)):
        # Parse Calling
        if (action == "outgoing" or action == "CALL" or action == "CONNECT" or action == "accepted" or action == "incoming" or action == "RING"):
            Calling()
        # Parse Sleeping: Checks also if calling is active
        if (action == "closed" or action == "DISCONNECT") and ("CONNECT" in str(details)):
            Sleeping()

# Read volume for later
print(Fore.LIGHTBLUE_EX + 'Get volume' + Style.RESET_ALL)
Volume = readVolume()

# Init hue
print(Fore.LIGHTBLUE_EX + 'Init hue' + Style.RESET_ALL)
Bridge = Bridge(HUEBRIDGEIP)
Bridge.connect() # If the app is not registered and the button is not pressed, press the button and call connect() (this only needs to be run a single time)
Bridge.get_api() # Get the bridge state (This returns the full dictionary that you can explore)

# Init call monitor
print(Fore.LIGHTBLUE_EX + 'Init Call monitor' + Style.RESET_ALL)
call = callmonitor() # Create new instance of py-fritz-monitor, Optinal parameters: host, port
call.register_callback (callBack) # Defines a function which is called if any change is detected, unset with call.register_callback (-1)
call.connect() # Connect to fritzbox

print(Fore.LIGHTBLUE_EX + 'Write close to end the script' + Style.RESET_ALL)
while(True):
    inputText = input()
    if inputText == "close":
        print(Fore.LIGHTBLUE_EX + 'Closing...' + Style.RESET_ALL)
        call.disconnect()
        break

 

Von |2016-12-05T07:49:38+01:002016-10-05|FritzboxOnAir, Python|

Doorbell – Update: Slacker

Alle guten Dinge sind drei…
Ich war nie zufrieden mit den Pushservices Pushover und Pushbullet.

Pushbullet würde die Bilder schön darstellen, aber pushed ab und zu unzuverlässig.

Da wir bei ibKastl derzeit für die interne Kommunikation Slack testen, kam mir die Idee meine Türklingel auch dort mal an die API anzubinden.

Das schöne an Slack ist, dass es für alle Mobile-/Desktop-Betriebssysteme Apps gibt!

Die API ist auch schön einfach… Einfach ein Team + Channel erstellen und den API-Key eintragen… mit drei Zeilen im Code ist es getan.

from slacker import Slacker

# Slack
slack = Slacker('myApiKey')
slack.files.upload('/home/pi/Desktop/doorbell/web/photos/' +  filename, title=now, channels='#doorbell')

Was der Code macht: Import von Slacker (Python-Lib) und dann einfach den Upload des Fotos mit dem Titel der aktuellen Zeit in den Channel #doorbell.

Auf dem Screenshot sieht man auch dass ich noch im alten Pythoncode die falsche Uhrzeit abgefragt habe… Das könnt ihr wie folgt korrigieren:

now=strftime("%Y-%m-%d %H:%M:%S", gmtime())

 

Doorbell_Slacker

Schön sieht man auch wie die IR-Kamera des Raspberry Pi im dunklen fotografiert, sogar mit Gegenlicht :^)

Von |2016-01-27T10:14:54+01:002016-01-27|Doorbell, Projekte|
Nach oben