You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.0 KiB
94 lines
3.0 KiB
#!/usr/bin/env python3
|
|
|
|
import shepherd.config as shconf
|
|
import shepherd.plugin
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
import argparse
|
|
|
|
from gpiozero import OutputDevice, Device
|
|
from gpiozero.pins.pigpio import PiGPIOFactory
|
|
|
|
from shepherd.plugins.betterservo import BetterServo
|
|
|
|
Device.pin_factory = PiGPIOFactory()
|
|
|
|
|
|
MOTHTRAP_LED_PIN = 6
|
|
MOTHTRAP_SERVO_PIN = 10
|
|
MOTHTRAP_SERVO_POWER_PIN = 9
|
|
|
|
|
|
class MothtrapPlugin(shepherd.plugin.Plugin):
|
|
@staticmethod
|
|
def define_config(confdef):
|
|
confdef.add_def('servo_open_pulse', shconf.IntDef(default=1200, minval=800, maxval=2200))
|
|
confdef.add_def('servo_closed_pulse', shconf.IntDef(default=1800, minval=800, maxval=2200))
|
|
confdef.add_def('servo_open_time', shconf.IntDef(default=5))
|
|
|
|
def __init__(self, pluginInterface, config):
|
|
super().__init__(pluginInterface, config)
|
|
self.config = config
|
|
self.interface = pluginInterface
|
|
self.plugins = pluginInterface.other_plugins
|
|
self.hooks = pluginInterface.hooks
|
|
|
|
self.root_dir = os.path.expanduser(pluginInterface.coreconfig["root_dir"])
|
|
self.id = pluginInterface.coreconfig["id"]
|
|
|
|
print("Mothtrap config:")
|
|
print(self.config)
|
|
|
|
servo_max = self.config["servo_open_pulse"] / 1000000
|
|
servo_min = self.config["servo_closed_pulse"] / 1000000
|
|
|
|
if servo_min > servo_max:
|
|
servo_min, servo_max = servo_max, servo_min
|
|
|
|
self.door_servo = BetterServo(MOTHTRAP_SERVO_PIN, initial_value=None,
|
|
active_high=False,
|
|
min_pulse_width=servo_min-0.000001,
|
|
max_pulse_width=servo_max+0.000001)
|
|
|
|
print(F"Supplied min: {servo_min}, max: {servo_max}")
|
|
|
|
self.door_servo_power = OutputDevice(MOTHTRAP_SERVO_POWER_PIN,
|
|
active_high=True,
|
|
initial_value=False)
|
|
|
|
self.led_power = OutputDevice(MOTHTRAP_LED_PIN,
|
|
active_high=True,
|
|
initial_value=False)
|
|
|
|
self.interface.attach_hook("picam", "pre_cam", self.led_on)
|
|
self.interface.attach_hook("picam", "post_cam", self.led_off)
|
|
self.interface.attach_hook("picam", "post_cam", self.run_servo)
|
|
|
|
self.interface.register_function(self.test)
|
|
|
|
def led_on(self):
|
|
self.led_power.on()
|
|
|
|
def led_off(self):
|
|
self.led_power.off()
|
|
|
|
def run_servo(self):
|
|
self.door_servo_power.on()
|
|
time.sleep(0.5)
|
|
|
|
self.door_servo.pulse_width = self.config["servo_open_pulse"] / 1000000
|
|
time.sleep(self.config["servo_open_time"])
|
|
|
|
self.door_servo.pulse_width = self.config["servo_closed_pulse"] / 1000000
|
|
time.sleep(self.config["servo_open_time"])
|
|
self.door_servo.detach()
|
|
self.door_servo_power.off()
|
|
|
|
def test(self):
|
|
self.led_on()
|
|
time.sleep(1)
|
|
self.led_off()
|
|
self.run_servo()
|