From 0f13eee4849b7c72a7af9705441ecbbdf2e18754 Mon Sep 17 00:00:00 2001 From: Rene Date: Sat, 14 Jun 2025 17:45:47 +0200 Subject: [PATCH] on high signal send to telegram --- local_code/animated_gif.py | 42 +++++++++++++++++ local_code/app.py | 42 ++++++++++------- local_code/demo_opts.py | 66 +++++++++++++++++++++++++++ local_code/display.py | 4 +- local_code/images/inverted_cat_s.gif | Bin 0 -> 18516 bytes 5 files changed, 136 insertions(+), 18 deletions(-) create mode 100644 local_code/animated_gif.py create mode 100644 local_code/demo_opts.py create mode 100644 local_code/images/inverted_cat_s.gif diff --git a/local_code/animated_gif.py b/local_code/animated_gif.py new file mode 100644 index 0000000..1dd469c --- /dev/null +++ b/local_code/animated_gif.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2017-2020 Richard Hull and contributors +# See LICENSE.rst for details. +# PYTHON_ARGCOMPLETE_OK + +""" +Displays an animated gif. +""" + +from pathlib import Path +from demo_opts import get_device +from PIL import Image, ImageSequence, ImageOps +from luma.core.sprite_system import framerate_regulator + + +def main(): + regulator = framerate_regulator(fps=45) + img_path = str(Path(__file__).resolve().parent.joinpath('images', 'inverted_cat_s.gif')) + banana = Image.open(img_path) + size = [min(*device.size)] * 2 + posn = ((device.width - size[0]) // 2, device.height - size[1]) + + while True: + for frame in ImageSequence.Iterator(banana): + with regulator: + #background = Image.new("RGBA", device.size, "black") + #background.paste(frame.resize(size, resample=Image.LANCZOS), posn) + #device.mode = "1" + #device.display(background.convert(device.mode)) + + + device.display(frame.convert(device.mode)) + + +if __name__ == "__main__": + try: + device = get_device() + main() + except KeyboardInterrupt: + pass + diff --git a/local_code/app.py b/local_code/app.py index 7f7e2f2..a9a44b6 100644 --- a/local_code/app.py +++ b/local_code/app.py @@ -1,24 +1,34 @@ -from RPi import GPIO +import RPi.GPIO as GPIO +import requests import time -# Set up GPIO pin (example using BCM pin 14) -GPIO_PIN = 26 +# Set up GPIO +GPIO.setmode(GPIO.BCM) +GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) -def setup(): - GPIO.setmode(GPIO.BCM) - GPIO.setup(GPIO_PIN, GPIO.IN) - -def loop(): - Messwert = GPIO.input(GPIO_PIN) # Read analog value from the pin - Spannung = ((Messwert * 250) / 1023) / 10 # Map and scale to desired range (0-2.5V) - print(f"Spannung: {Spannung:.2f} V") # Print with two decimal places - - time.sleep(1) +def send_message(): + try: + response = requests.post( + 'http://beere5:5020/send', + json={'message': 'klingel geht'}, + headers={'Content-Type': 'application/json'} + ) + return f"Message sent with status code {response.status_code}" + except Exception as e: + return f"Error sending message: {str(e)}" +# Main loop if __name__ == "__main__": - setup() try: while True: - loop() + current_state = GPIO.input(19) + if current_state == 1: + print("GPIO Pin 19 is HIGH") + result = send_message() + print(result) + time.sleep(5) + time.sleep(0.5) # Check pin every 5 seconds except KeyboardInterrupt: - GPIO.cleanup() # Clean up when Ctrl+C is pressed \ No newline at end of file + print("\nProgram stopped by user") + finally: + GPIO.cleanup() diff --git a/local_code/demo_opts.py b/local_code/demo_opts.py new file mode 100644 index 0000000..e9695fe --- /dev/null +++ b/local_code/demo_opts.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2014-2022 Richard Hull and contributors +# See LICENSE.rst for details. + +import sys +import logging + +from luma.core import cmdline, error + + +# logging +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)-15s - %(message)s' +) +# ignore PIL debug messages +logging.getLogger('PIL').setLevel(logging.ERROR) + + +def display_settings(device, args): + """ + Display a short summary of the settings. + + :rtype: str + """ + iface = '' + display_types = cmdline.get_display_types() + if args.display not in display_types['emulator']: + iface = f'Interface: {args.interface}\n' + + lib_name = cmdline.get_library_for_display_type(args.display) + if lib_name is not None: + lib_version = cmdline.get_library_version(lib_name) + else: + lib_name = lib_version = 'unknown' + + import luma.core + version = f'luma.{lib_name} {lib_version} (luma.core {luma.core.__version__})' + + return f'Version: {version}\nDisplay: {args.display}\n{iface}Dimensions: {device.width} x {device.height}\n{"-" * 60}' + + +def get_device(actual_args=None): + """ + Create device from command-line arguments and return it. + """ + if actual_args is None: + actual_args = sys.argv[1:] + parser = cmdline.create_parser(description='luma.examples arguments') + args = parser.parse_args(actual_args) + + if args.config: + # load config from file + config = cmdline.load_config(args.config) + args = parser.parse_args(config + actual_args) + + # create device + try: + device = cmdline.create_device(args) + print(display_settings(device, args)) + return device + + except error.Error as e: + parser.error(e) + return None + diff --git a/local_code/display.py b/local_code/display.py index 9f9d5a9..977ad80 100644 --- a/local_code/display.py +++ b/local_code/display.py @@ -15,10 +15,10 @@ from luma.core.sprite_system import framerate_regulator def main(): - regulator = framerate_regulator(fps=60) + regulator = framerate_regulator(fps=45) img_path = str(Path(__file__).resolve().parent.joinpath('images', 'cat.gif')) banana = Image.open(img_path) - size = [min(*device.size)] * 2 + size = [min(*device.size)] * 3 posn = ((device.width - size[0]) // 2, device.height - size[1]) while True: diff --git a/local_code/images/inverted_cat_s.gif b/local_code/images/inverted_cat_s.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5628dce2d1a287eb5dadf34776c040ba67cdb86 GIT binary patch literal 18516 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 literal 0 HcmV?d00001