Deel 2: Neopixels als Homekit HUE lamp
Stap 2.1. Voorbereiden Homebridge installatie.
We gaan nu homebridge installeren. Ik heb geen Alexa / Google Home, maar dat moet in principe ook met Homebridge samenwerken.
sudo apt-get update
sudo apt-get upgrade
Dat zou snel moeten gaan op een Pi die net geüpdated is.
g++ -v
Geeft bij mij: gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)
Zou prima moeten zijn, die stap slaan we verder dus over.
Op de Zero moet je even wat meer moeite doen om NodeJS te installeren:
“## You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the ‘linux-armv6l’ binary tarballs available directly from nodejs.org for Node.js 4 and later.”
We zoeken daarom even “Pi Zero NodeJS” en vinden bijv:
$ curl -o node-v9.7.1-linux-armv6l.tar.gz https://nodejs.org/dist/v9.7.1/node-v9.7.1-linux-armv6l.tar.gz
$ tar -xzf node-v9.7.1-linux-armv6l.tar.gz
$ sudo cp -r node-v9.7.1-linux-armv6l/* /usr/local/
Als alles goed gaat kun je nu controleren of node draait:
$ node -v
Dit geeft v9.7.1 terug.
We checken de node package manager ook nog even:
$ npm -v
5.6.0
We installeren Git ook meteen maar even:
$ sudo apt-get install git
Aha: dat doet het al in onze Buster versie: “git is already the newest version (1:2.20.1-2).”
Avahi doet het ook al in Buster, voor de zekerheid toch maar even deze stap omdat Homebridge soms wat achter loopt.
$ sudo apt-get install libavahi-compat-libdnssd-dev
Stap 2.2. Homebridge zelf
Nu volgen we de stappen voor Homebridge zelf: GitHub - homebridge/homebridge: HomeKit support for the impatient.
$ sudo npm install -g --unsafe-perm homebridge
Ok, bij mij werkte dat vlekkeloos!
$ homebridge
“No plugins found. See the README for information on installing plugins.”
Je kunt het indirect doen, met MQTT, mooie IoT oplossing, dan kun je je Zero ook nog voor allerlei andere dingen gebruiken
en is het alleen een “home bridge”
Stap 2.3. Homebridge Neopixel
Er is weinig te vinden wat als directe oplossing wil. Ik heb o.a. naar homebridge-opc gekeken maar dat is niet precies wat ik
wil.
We kunnen in python wel een simpel REST servertje implementeren en daar met homebridge-neopixel tegenaan praten,
dat het dan lokaal is maakt natuurlijk weinig uit.
Met de Node package manager kun je “homebridge-neopixel” installeren:
$ npm install -g homebridge-neopixel
Stap 2.4. REST HUE servertje
Op https://www.npmjs.com/package/homebridge-neopixel en HomeBridge – NEOPixel Light - StudioPieters® krijgen we
een aardig idee van wat we doen moeten om eea aan de praat te krijgen, alleen vertalen we die ESP8266 code naar Python.
Dit is een goede basis voor het servertje in Python (3):
#!/usr/bin/python3
import socket
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
hostName = ""
hostPort = 80
class MyServer(BaseHTTPRequestHandler):
# method for GET request
def do_GET(self):
self.send_response(200)
# hier moet onze code om commando's af te vangen
content = "<p>You accessed path: {}</p>".format(self.path)
self.response()
# POST is for submitting data.
def do_POST(self):
print( "incoming http POST: ", self.path )
content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
post_data = self.rfile.read(content_length) # <--- Gets the data itself
self.send_response(200)
client.close()
#import pdb; pdb.set_trace()
def response(self, content):
self.wfile.write(bytes(content, "utf-8"))
myServer = HTTPServer((hostName, hostPort), MyServer)
print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort))
try:
myServer.serve_forever()
except KeyboardInterrupt:
pass
myServer.server_close()
print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))
Stap 2.5. Commando’s:
We moeten een aantal commando’s afvangen:
- on
- off
- set
- status
- color
- bright
Stap 2.6. Netatalk (optioneel):
Het is niet heel prettig om te ontwikkelen op de Pi zelf. Ik heb daarom netatalk geïnstalleerd.
Daarmee kan ik vanuit de macOS finder de Pi als schijf benaderen en gewoon in mijn favoriete editor werken.
N.b. voor windows heb je SAMBA nodig, daar zijn ook wel tutorials voor te vinden.
$ sudo apt-get install netatalk
Netatalk 3 heeft de configuratie in /etc/netatalk/afp.conf staan
$ sudo nano /etc/netatalk/afp.conf
Ik heb daar dit ingezet:
[Homes]
basedir regex = /home
Eventjes opslaan en dan voer je dit commando uit:
$ sudo systemctl restart netatalk
Daarna kan ik mijn Pi gewoon als schijf benaderen.
def processServerRequest(self, path):
global last_color
global state
if ("/on" in path):
self.setHex(last_color)
state = 1
return "OK"
if ("/off" in path):
state = 0
self.setHex((0,0,0))
return "OK"
if ("/set/" in path):
_hexString = path[5:]
last_color = self.stringToRGB(_hexString)
self.setHex(last_color)
return "OK"
if ("/status" in path):
return str(state)
if ("/color" in path):
_result = "{:02x}{:02x}{:02x}".format(r,g,b)
print(_result)
return _result
if ("/bright" in path):
_brightness = self.getBrightness()
return str(_brightness)
return "Unknown"
Daarna is het tijd om je config.json aan te passen:
$ nano /home/pi/.homebridge/config.json
De volledige Python 3 server code staat hier op GitHub:
N.b. Zie ook de config.json file daar.