diff --git a/.gitignore b/.gitignore index f67bcbf..2754aa7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ obj/ .vs/ _ReSharper.Caches/ -Private/ \ No newline at end of file +Private/ + +__pycache__/ diff --git a/DeviceStatus/Sender/.gitignore b/DeviceStatus/Sender/.gitignore new file mode 100644 index 0000000..1d74e21 --- /dev/null +++ b/DeviceStatus/Sender/.gitignore @@ -0,0 +1 @@ +.vscode/ diff --git a/DeviceStatus/Sender/config.py b/DeviceStatus/Sender/config.py new file mode 100755 index 0000000..4dc6032 --- /dev/null +++ b/DeviceStatus/Sender/config.py @@ -0,0 +1,6 @@ +from device import Device + +devices = [] + +devices.append(Device("washer", 20)) +devices.append(Device("dryer", 21)) \ No newline at end of file diff --git a/DeviceStatus/Sender/device.py b/DeviceStatus/Sender/device.py new file mode 100755 index 0000000..f7911b5 --- /dev/null +++ b/DeviceStatus/Sender/device.py @@ -0,0 +1,6 @@ +class Device: + last_status = 0 + + def __init__(self, name, pin): + self.name = name + self.pin = pin \ No newline at end of file diff --git a/DeviceStatus/Sender/device_status_sender.service b/DeviceStatus/Sender/device_status_sender.service new file mode 100755 index 0000000..53c0a06 --- /dev/null +++ b/DeviceStatus/Sender/device_status_sender.service @@ -0,0 +1,9 @@ +[Unit] +Description=Device Status Server Service + +[Service] +Environment=PYTHONUNBUFFERED=1 +ExecStart=/usr/bin/python /home/ckaczor/Code/Personal/HomeMonitor/DeviceStatus/Sender/sender.py + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/DeviceStatus/Sender/sender.py b/DeviceStatus/Sender/sender.py new file mode 100755 index 0000000..260dd6d --- /dev/null +++ b/DeviceStatus/Sender/sender.py @@ -0,0 +1,73 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import config +import RPi.GPIO as GPIO +import time +import paho.mqtt.client as mqtt + +from datetime import datetime as dt +from paho.mqtt.client import connack_string as ack +from paho.mqtt.properties import Properties +from paho.mqtt.packettypes import PacketTypes + + +def log(message=""): + print(dt.now().strftime("%H:%M:%S.%f")[:-2] + " " + message) + + +def on_connect(client, userdata, flags, rc, v5config=None): + log("Connection returned result: " + ack(rc)) + + +def on_publish(client, userdata, mid, tmp=None): + log("Published message id: " + str(mid)) + + +log("Config:") + +for device in config.devices: + log(" pin %s: %s" % (device.pin, device.name)) + +log() + +client = mqtt.Client(client_id="device_status_sender", + transport="tcp", + protocol=mqtt.MQTTv5) + + +properties = Properties(PacketTypes.CONNECT) +properties.SessionExpiryInterval = 30 * 60 + +client.connect("172.23.10.3", 1883, 60, + clean_start=mqtt.MQTT_CLEAN_START_FIRST_ONLY, properties=properties) + +client.on_connect = on_connect +client.on_publish = on_publish + +client.loop_start() + +GPIO.setmode(GPIO.BCM) + +for device in config.devices: + log("Setting up pin %s" % (device.pin)) + GPIO.setup(device.pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + +log() + +while True: + for device in config.devices: + pin_status = GPIO.input(device.pin) + + if pin_status != device.last_status: + log("pin %s: %s" % (device.pin, pin_status)) + + device.last_status = pin_status + + info = client.publish(device.name, str(pin_status), 1) + + info.wait_for_publish() + + time.sleep(0.25) + +GPIO.cleanup()