Script in Objekt orientiert

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
phi-winz
User
Beiträge: 1
Registriert: Samstag 23. Juni 2018, 06:26

Hallo zusammen,

ich muss am Donnerstag meine Projektarbeit abgeben und dazu muss ich dieses Script object orientiert programmieren, wobei ich keine Ahnung habe.
Kann mir hierzu jemand jhelfen?

Vielen Dank im Voraus
Phillip

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 12 11:25:37 2018

@author: pi
"""
import time, datetime
import RPi.GPIO as GPIO
import telepot
from telepot.loop import MessageLoop
from picamera import PiCamera
from time import sleep
camera = PiCamera()

      
#benutze Pins     
other = 4
yellow = 13
red = 5
green = 26
taster = 21
#Import fǬr GPIO
now = datetime.datetime.now()
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#beschreibung der GPIO
#other
GPIO.setup(other, GPIO.OUT)
GPIO.output(other, 0) #Off initially
#LED Yellow
GPIO.setup(yellow, GPIO.OUT)
GPIO.output(yellow, 0) #Off initially
#LED Red
GPIO.setup(red, GPIO.OUT)
GPIO.output(red, 0) #Off initially
#LED green
GPIO.setup(green, GPIO.OUT)
GPIO.output(green, 0) #Off initially
#taster
GPIO.setup(taster, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)#Signal HIGH bis 'Taster' dann LOW

class RemotePi:# klÇÏglicher definitions Versuch bzgl. OOP
    pass


#Interaktion mit Telegram App
def action(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    print ('Received: %s') % command

    if 'on' in command:
        message = "Turned on "
        if 'other' in command:
            message = message + "other "
            GPIO.output(other, 1)
        if 'yellow' in command:
            message = message + "yellow "
            GPIO.output(yellow, 1)
        if 'red' in command:
            message = message + "red "
            GPIO.output(red, 1)
        if 'green' in command:
            message = message + "green "
            GPIO.output(green, 1)
        if 'all' in command:
            message = message + "all "
            GPIO.output(other, 1)
            GPIO.output(yellow, 1)
            GPIO.output(red, 1)
            GPIO.output(green, 1)
        message = message + "light(s)"
        telegram_bot.sendMessage (chat_id, message)

    if 'off' in command:
        message = "Turned off "
        if 'other' in command:
            message = message + "other "
            GPIO.output(other, 0)
        if 'yellow' in command:
            message = message + "yellow "
            GPIO.output(yellow, 0)
        if 'red' in command:
            message = message + "red "
            GPIO.output(red, 0)
        if 'green' in command:
            message = message + "green "
            GPIO.output(green, 0)
        if 'all' in command:
            message = message + "all "
            GPIO.output(other, 0)
            GPIO.output(yellow, 0)
            GPIO.output(red, 0)
            GPIO.output(green, 0)
        message = message + "light(s)"
        telegram_bot.sendMessage (chat_id, message)
#beginn CAM     
    if 'picture' in command:
        message = "Picture"
        if 'send' in command:
            message = " waiting for last "+ message + "..."
            message = message
            telegram_bot.sendMessage (chat_id, message)
            telegram_bot.sendDocument(chat_id, document=open('/home/pi/PiCam.jpg'))
        if 'take' in command:
            message = message + " taken ..."
            message = message
            telegram_bot.sendMessage (chat_id, message)
            camera.capture ('PiCam.jpg')
            sleep(1)
            telegram_bot.sendDocument(chat_id, document=open('/home/pi/PiCam.jpg'))
            #Ende  CAM
#Remote Funktioniert bis hier her-->Messenger kommunikation.

#Taster einbinden, funktioniert NICHT!"
def doIfHigh(channel):
    chat_id = channel ['chat']['id']
    # Wenn Eingang HIGH ist, Ausgabe im Terminal erzeugen
    print ("Eingang HIGH ")
    message = "New Move"
        
    telegram_bot.sendMessage (chat_id, message)
    camera.capture ('PiCam.jpg')
    sleep(1)
    telegram_bot.sendDocument(chat_id, document=open('/home/pi/PiCam.jpg'))
 
# Ereignis deklarieren
GPIO.add_event_detect(taster, GPIO.RISING, callback = doIfHigh, bouncetime = 200)
#Ende Taster einbinden
   
telegram_bot = telepot.Bot('******')
print (telegram_bot.getMe())

MessageLoop(telegram_bot, action).run_as_thread()
print ('Up and Running....')

while 1:
    time.sleep(10)
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Gibt es zu "in Objekt orientiert machen" ein paar mehr Informationen? Oder ist das die einzige Grundvoraussetzung / Aufgabenstellung?

Was ungünstig ist ist die Tatsache, dass man deinen Code kaum lesen kann, da du ihn nicht mit Code-Tags hier definiert hast. Es fehlen bspw. sämtliche Einrückungen die für Python essentiell sind. Des weiteren schreibt man Konstanten in Python groß. Auch sollte man wissen, wann man objekt-orientiert programmieren sollte bzw. was man voraussetzen sollte, um eine Klasse zu definieren. Dazu könnte man sagen, dass man für eine Klasse immer Attribute und Methoden benötigt, also "Funktionsweise" und "Daten", was *macht* deine Klasse `RemotePi` denn eigentlich? Wenn du das geklärt hast, kannst du dir auch einen passenderen Namen einfallen lassen.

Vielleicht hilft es, die "Objekte" erstmal auf ein weißes Blatt Papier zu zeichnen und ihre Beziehungen zu einander eindeutig festlegen zu können. Dabei gibt es zig Möglichkeiten wie ich jetzt via Raspberry Commandos via Telegram-Bot konsumiere und verabeite, was darin resultiert die GPIOs anzusprechen. Du hast übrigens eine Endlosschleife gebaut deren Bedingung zum Abbruch nicht definiert wurde.
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@phi-winz: bevor man ein Programm umschreibt, sollte man es aufräumen. Du hast einmal die Kodierung verändert, so dass jetzt alle Umlaute kaputt sind.
Was macht ein Pin der other heißt? Konstanten schreibt man, wie sls schon gesagt hat, KOMPLETT_GROSS. Module schreibt man kompett klein. Diese unsäglichen `as`-Import von GPIO findet man immer, aber anstatt die Schreibweise zu korrigieren, wird da nur etwas komplizierter geschrieben, als es sein müßte.

Warnungen sind dazu da, dass man die Ursache behebt, nicht, dass man sie abschaltet. Apropos Warnungen, Du rufst nirgends gpio.cleanup auf. Auf oberster Ebene sollte kein ausführbarer Code stehen, die GPIO-Initialisierung gehört z.B. in eine initalize-Funktion, das passende Gegenstück, finalize, fehlt, ist bei Hardwaransteuerung aber auch wichtig, die Camera will sauber abgeschaltet werden. Die letzten 10 Zeilen wollen in eine Funktion `main`, die am Anfang initialize und über einen finally-Block auch finalize aufruft.

now wird definiert, aber nirgends benutzt, zudem ist now ziemlich schnell der falsche Name für die Variable. In der Funktion `action` hast Du sehr viel doppelt und fünffach kopierten Code, den man mit der passenden Datenstruktur sehr viel kürzer schreiben könnte.

Die Funktion bekommt aus dem Nichts telegram_bot und camera, das sollte nicht sein, alles was eine Funktion braucht, sollte sie über ihre Parameter bekommen.

Weder telegrambot noch camera darf man wahrscheinlich nebenläufig benutzen, so dass der Event-Callback so nicht sein darf. Ein Event-Loop im bisher ungenutzten Hauptthread könnte Abhilfe schaffen.

Wenn Du etwas objektorientiert Programmieren willst, brauchst Du erst einmal ein Objekt, eine in sich abgeschlossene Einheit aus Zustand und Methoden, die auf diesem Zustand arbeiten.

Man könnte verschiedene Aktion-Objekte bilden, die man nach ihren Kommandos fragen kann, und deren Aktion man ausführen kann. Der Zustand einer LED-Aktion wäre dann ihr PIN, die Kommandos on und off. Die Camera-Aktion wäre eine andere Klasse.
Antworten