Samstag, 20. Juni 2020

CatWatch auf Raspberry Pi Zero adaptiert

ESP 8266-01 gegen R-Pi Zero ausgetauscht

Hallo, hier wieder ein kurzes Update über den Katzenschreck. Ich hatte noch einen alten Pi Zero in der Schublade, ohne WLAN und ohne Bluetooth Funktion. Also einen von ganz früher. Da habe ich einen WLAN Stick angesteckt und mal getestet wie der im Garten sich in das Netz ein loggt. Das klappt wesentlich zuverlässiger als mit dem ESP. Also habe ich in den letzten Tagen immer wenn Zeit war, das Skript vom ESP auf den Pi in Python umgeschrieben. Dadurch dass mir beim Pi viele GPIO's zur Verfügung stehen, habe ich noch drei Status LED's vorgesehen.

1. Websocket Verbindung steht
2. Sende LED
3. ERROR LED

Das macht die (hoffentlich nie vorkommende) Fehlersuche im Feld einfacher.
Darüber hinaus habe ich auch eine Funktion einprogrammiert, mit der ich sehe in welchem meiner WLAN Netze der Pi sich einloggt.
Eben habe ich den Pi in ein spritzwasserdichtes Gehäuse eingebaut und heute Nacht wird getestet. Also getestet habe ich eben schon, aber in den letzten Nächten hatten wir immer mal wieder Katzenbesuch im Garten, diese Nacht werden sie dann nass. Bin gespannt und werde berichten. Wenn das alles zufriedenstellend läuft, dann wird in der kommenden Woche die Wasserinstallation um 2 Ventile ergänzt und die Gardena-Zeitschaltuhr die derzeit noch im Garten steht durch den Pi Water-Controler ersetzt.
Hier nun der Code von dem Python Programm dass auf dem pi als Client läuft. Es wird beim Booten automatisch gestartet.

#!/usr/bin/env python
import websocket
import subprocess
import socket
import thread
import threading
import time
import json
import RPi.GPIO as GPIO

#Beispielcode habe ich hier gefunden und auf meine Belange erweitert
#https://blog.zackad.dev/en/2017/08/15/get-started-with-python-websocket-client.html

def get_ip_address():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
return s.getsockname()[0]

def network():
try:
output = subprocess.check_output(['sudo', 'iwgetid'])
#print("Connected Wifi SSID: " + output.split('"')[1])
return output.split('"')[1]
except Exception, e:
print e
return "Kein WLAN erkannt"

def rel_1_on(stime, status):
if status == "AUS":
rel_1_off()
return
if status == "AN":
GPIO.output(17,GPIO.HIGH)
JSONtxt='[{"ID":"'+ipaddr+'","Typ":"Cat-Watch-Brause","Nachricht":"success"},
[{"Wert":"'+stime+'","Zustand":"AN"}]]'
ws.send(JSONtxt)
print stime
print status
print "Relais Strahl " + status + " fuer "+ stime + " Sekunden"
t = threading.Timer(int(stime), rel_1_off)
t.start()
return

def rel_1_off():
print "Strahl AUS"
GPIO.output(17,GPIO.LOW)
JSONtxt='[{"ID":"'+ipaddr+'","Typ":"Cat-Watch-Brause","Nachricht":"success"},
[{"Wert":"0","Zustand":"AUS"}]]'
ws.send(JSONtxt)
def on_message(ws, message):
GPIO.output(16, GPIO.HIGH)
print "received"
decode_message(message)
GPIO.output(16, GPIO.LOW)
def decode_message(message):
x = json.loads(message)
m = x[0]
n= x[1]
print m["ID"]
print m["Typ"]
print m["Nachricht"]
if m["Typ"] == "Cat-Watch-Brause" and m["Nachricht"] == "action":
rel_1_on(n[0]["Wert"],n[0]["Zustand"])

def on_error(ws, error):
print error

def on_close(ws):
print "### closed ###"
GPIO.output(23, GPIO.LOW)
rel_1_off()
# Attemp to reconnect with 10 seconds interval
print "### I'll try it again in 10 seconds ###"
time.sleep(10)
initiate()

def on_open(ws):
print "### Initiating new websocket connection ###"
message = "online";
GPIO.output(23, GPIO.HIGH)
typ="Cat-Watch-Brause";
wert="0";
zustand="off";
JSONtxt='[{"ID":"'+ipaddr+'","Typ":"'+typ+'",
"Nachricht":"Checked in im '+ ssid +', Bin nun online"} ,
[{"Wert":"'+wert+'","Zustand":"off"}]]'
ws.send(JSONtxt)
def initiate():
websocket.enableTrace(True)
global ws
ws = websocket.WebSocketApp("ws://192.168.178.38:8888/ws",
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()

if __name__ == "__main__":
    GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(23, GPIO.OUT) # Online LED
GPIO.setup(16, GPIO.OUT) # Message LED
GPIO.setup(26,GPIO.OUT) # Error LED" Noch nicht implementiert
GPIO.setup(17,GPIO.OUT) # Relais 1 Cat-Watch-Brause
GPIO.setup(27,GPIO.OUT) # Relais 2 WaterControl 1 Noch nicht implementiert
GPIO.setup(22,GPIO.OUT) # Relais 3 WaterControl 2 Noch nicht implementiert
global ipaddr
global ssid
ipaddr = get_ip_address()
  ssid = network()
 print ssid
print ipaddr
initiate()

Keine Kommentare:

Kommentar veröffentlichen