Dienstag, 30. Juni 2020

Cat Watch update

Die nächsten Aktionen

Nach der Umrüstung des Clients auf einen Raspberry Pi Zero läuft das System recht zuverlässig. In den letzten Nächten gab es immer mal wieder Katzen Alarm der bei den Tieren auch immer wieder für Überraschungen gesorgt hat.
Haufen wurden keine mehr gefunden, sie haben keine Zeit mehr. Denn nach ein paar Sekunden setzt die Brause ein und dann suchen die Katzen ganz schnell das Weite.
Dennoch habe ich noch einige Verbesserungen vorgenommen und noch vorzunehmen.
  1. Ich habe ein einfaches Webfrontend geschrieben mit dem ich sehen kann ob die Katzen Dusche eine Websocket Verbindung hat, dann sind die Buttons grün, und ich kann sie über die Buttons auslösen.
    Für die beiden noch fehlenden Ventile befinden sich ebenfalls dann Buttons für die Minimale Steuerung. An der Schaltuhr arbeite ich immer mal wieder sporadisch

  2. Ich habe einen Watchdog für das Python Script geschrieben. Bisher ist es aus irgendwelchen Gründen abgebrochen. Einige Programmänderungen habe ich vorgenommen, aber die Erfahrung sagt, dass es immer etwas gibt, an was man nicht bei der Coding gedacht hat. Also habe ich ein Bash Script geschrieben, dass alle 5 Minuten vom Cron angesprochen wird. Sollte das Python Script nicht laufen, wird es gestartet.

    #!/bin/bash
    SERVICE="ventil.py"
    if pgrep -af "$SERVICE" >/dev/null
    then
        echo "$SERVICE is running"
       
    else
       
        d=`date +%Y-%m-%d-%H-%M`
        echo "$d Starte ventil.py neu" >> /home/pi/dev/ws/error.txt
        python /home/pi/dev/ws/ventil.py &
        # uncomment to start nginx if stopped
        # systemctl start nginx
        # mail 
    fi


  3. Als nächstes muss noch eine Notfallroutine für das Ventil her.
    Denn was passiert, wenn das Programm mal in einen undefinierten Zustand kommt wenn gerade ein Ventil offen ist und das Wasser anhaltend durch die Brause läuft?
    Vor allem wenn man z.B. in Urlaub ist. Besonders wichtig, wenn noch die beiden anderen Ventile zur Gartenbewässerung eingebaut werden.
    Da stelle ich mir auch einen Cron Job vor, der prüft ob ein Ventil geöffnet ist, wenn ja wird geprüft, wie lange es schon offen ist, ist es zulange offen
    - und dass kann mittels GPIO Datei abgefragt werden - wird ein Script aufgerufen, welches dann das Ventil schließt.

  4. Und dann als letztes müssen natürlich noch die beiden fehlenden Ventile mechanisch nachgerüstet werden. Herr Amazon lässt sich mit der Lieferung Zeit.


Auf den Bildern habe ich den Aufbau noch dokumentiert. Letztendlich findet die Elektronik Platz in einer 3Fach Unterputzdose. Diese wird dann vor Einbau in den Schaltkasten Spritzwasser tauglich abgedichtet. Somit kann ich dann ruhigem Gewissen in Urlaub fahren.
 

Dienstag, 23. Juni 2020

Katze geduscht

CatWatch - Die erste Katze wurde vertrieben

Heute morgen war es dann so weit. Eine der drei wilden Katzen kam mal wieder auf einen Besuch vorbei. Bevor es zum Markieren des Revieres kam, ging die Brause an. Sie sucht ganz schnell das Weite.



Nun heißt es für mich, die Software noch verfeinern, HW erweitern und vor allem fachgerecht installieren. Bei der Gelegenheit werde ich dann gleich die zwei zusätzlichen Magnetventile einbauen.
Am Frontend für die Zeitschaltuhr muss ich noch ein paar Tage programmieren, aber das Wetter ist im Moment zu schön dafür.


Ich werde berichten

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()

Dienstag, 16. Juni 2020

Der Zusammenbau

Erster Testbetrieb

Bin nun endlich dazu gekommen den Testbetrieb zu realisieren. Die Rohre verhanft und auf Dichtigkeit geprüft. Als Gehäuse dient erst einmal ein Behälter in dem Gartendünger war. Damit das ganze ein wenig halt kriegt, habe ich ein Teil des Eimers ausgeschäumt. Dann das T-Stück hinein gelegt.

Das ESP Modul fand in einer Feuchtraum Abzweigdose Platz. Passt ganz gut, für den ersten Aufbau wird es reichen.


Der ESP loggt sich ins WLAN ein und sendet dann einen Websocket Event an den Server.
Im gleichen Netz hängt die MotionEye Kamera. Als Motiondetection-Event schickt der WebSocket Server ein Socket an das ESP-Modul. Das Relais zieht an und damit wird das Magnetventil für die Wasserbrause wird angezogen. Die Sandfläche wird besprengt. Alles in im ersten Wurf mit Kabelbindern fixiert. Schön kommt später.


Soweit die Theorie. Hat auch gut funktioniert. Es gibt lediglich eine Herausforderung:
Mein WLAN ist an dem Gartenwasserhahn für den ESP sehr schwach. Somit ist er nicht immer im Netz, und es kommt zu Aussetzern. Das muss auf jeden Fall verbessert werden. Da die Stromaufnahme vom ESP ähnlich hoch ist, wie ein Raspberry Pi Zero, werde ich in die UP- Dose einbauen, und damit testen.

Ich werde berichten! 







Donnerstag, 11. Juni 2020

Das Magnetventil ist da

Wasser Marsch

Gestern ist das Magnetventil geliefert worden. Für die Catwatch Lösung wird dann bei Motion-Erkennung Wasser über die Sandfläche gesprüht.



Hierzu habe ich ein 230Volt Magnetventil bestellt. Mittels einigen Installationsrohren habe ich erst einmal ein simples T-Stück realisiert. Am unteren Ende wird dann der Wasserschlauch für die Sandfläche angeschlossen. Später werde ich dann das T-Stück mit Magnetventilen erweitern. Dann kann ich die Blumen oder andere Pflanzen noch automatisch bewässern.




Das Magnetventil wird von einem ESP 8266-01  über WebSocket eingeschaltet. Der Sketch im ESP 8266-01 sorgt dafür, dass der Wasserstrahl dann einige definierte Sekunden über die Sandfläche strahlt und sich dann wieder selbständig ausschaltet.





Nun geht es an die Installation!

Mittwoch, 10. Juni 2020

Katzen im Sandkasten

Catwatch

In unserem Garten haben wir eine Sandfläche für die Enkelkinder geschaffen. In Summe haben wir 3 m³ Wesersand mit der Schubkarre in den Garten geschoben.
Für die Enkelkinder ein Riesenspaß, wenn man nicht beim Buddeln auf Hinterlassenschaften von Katzen stößt die bei uns wild herum laufen.

Nun möchte ich mal sehen ob es hauptsächlich eine Katze ist, oder ob sich dort mehre Katzen tummeln. Dazu habe ich letzte Woche mit einen Raspberry Pi Zero und der Software Motioneyeos eine Überwachung unserer Sandfläche gebaut.



Die Aufnahmen sind sehr interessant, mit einem Infrarotscheinwerfer wird Nachts die Fläche ausgeleuchtet. Im Moment plane ich mit einem MotionEvent die Sandfläche mit Wasser zu besprengen, wenn eine Katze in der Nacht von der Kamera erfasst wird. In der Hoffnung, sie hat dann keine Lust mehr ihr Geschäft zu machen.

Ich werde berichten!