Bo

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

hallo Freunde von Python!

Ich habe eine kleine Frage zu meinem Script:

Code: Alles auswählen

#!usr/bin/python

import os
import time

standby='/home/steckdosen/codes/standby.txt'

if os.path.exists(standby):
    os.system('irsend SEND_ONCE vusolo KEY_POWER')
    os.system('rm /home/steckdosen/codes/standby.txt')
else:
    os.system('irsend SEND_ONCE vusolo KEY_POWER')
    time.sleep(1)
    os.system('irsend SEND_ONCE vusolo KEY_3')
    time.sleep(1)
    os.system('touch /home/steckdosen/codes/standby.txt')
Durch das Script wird meine Sat Box in den Standby gefahren. Ich steuer fast alles über Alexa was wahrscheinlich auch eher Nebensache ist.
Sage ich nun "TV aus" wird natürlich der Untere Part vom Python Script ausgeführt da ja die Standby.txt erst nicht vorhanden ist.
sage ich beim nächsten mal "TV an" wird natürlich der obere Part ausgeführt und die Standby.txt wieder gelöscht. Also ein Kreislauf. Genau so wollte ich es ja auch haben weil ich sage ja nicht das die Sat Box zweimal in den Standby Fahren soll.
Jetzt ist es aber so, das mein Samsung Fernseher eine Schutzzeit hat, was bedeutet er geht nach 4 Stunden einfach aus, meine Box ist aber weiterhin an. Jetzt kann ich nicht einfach sagen "TV an" weil ja sonst im Hintergrund meine Box in den Standby fährt. Da mein Fernseher nicht angepingt werden kann wenn er in Standby ist wollte ich es vll so realisieren das wenn er nicht angepingt werden kann, nur der Fernseher angemacht wird mit "irsend SEND_ONCE samsung KEY_POWER" und alles andere ausser acht gelassen wird bis wieder die Standby.txt vorhanden ist.
Wie kann ich das Script so umschreiben das wenn keine Standby.txt vorhanden ist, und ich sage "TV an" nur "irsend SEND_ONCE samsung KEY_POWER" ausgeführt wird, damit nur wieder mein Fernseher an ist und nichts anderes ausgeführt wird?

Danke schonmal"
Zuletzt geändert von Anonymous am Donnerstag 18. Mai 2017, 17:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BigZ
User
Beiträge: 30
Registriert: Mittwoch 1. Juli 2015, 21:18
Wohnort: Hamburg
Kontaktdaten:

Eventuell das Alter der Datei überprüfen mit os.stat()?
Wenn du 4 Stunden lang nicht Fernseher aus gesagt hast, ignoriert er die vorhandene Datei und schreibt sie neu wenn du das nächste Mal Fernseher an sagst, oder war das umgekehrt? Bild
"Ist noch λ?"
"Ja, aber das ϕ ist noch ϱ"
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

nein, wenn ich gar nicht "TV Aus" gesagt habe, geht der Fernseher einfach nach 4 Stunden aus. die sogenannte schutzzeit beim TV.
Das problem besteht ja dann, dass wenn nur der Fernseher durch die Schutzzeit ausgeht, ich dann aber sage TV An, er dann natürlich meinen Receiver in Standby versetzt, was ja nicht sinn der Sache ist, da der Receiver ja an ist, wenn nur der TV in die Schutzzeit geht.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht, wieso du überhaupt diese Standby Nummer machst. Dunredst die ganze Zeit von tv an und tv aus, aber dein Skript scheint nur ein toggle zu sein - quasi nur tv irgendwas sagen.

Da würde ich ansetzen. Wenn du auch an und aus verstehst, musst du kein Standby flag mitführen.
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

ja du hast recht, im grunde ist es nur ein toogle. Auch wenn ich sagen würde TV an obwohl er an ist, geht der Fernseher in Standby. Ich bin leider noch nicht so weit um es irgendwie anderweitig zu schreiben. mir war es mit der Art, die ich bisher gelernt habe, am "sinnvollsten".
Das heisst das Script ist im Prinzip ein Kreislauf, ob ich nun TV an oder aus sage, Der Kreislauf ist der gleiche. Ich dachte mir halt das es so am leichtesten ist um zu "prüfen" ob die Steckdose "an" oder "aus" ist.

Das mit dem Standby ist ja nur noch ein kleiner Feinschliff!
Ich habe ja zwei Scripte: Einmal "Wohnzimmer Fernseher" und einmal "TV".
Wenn ich nun Alexa sage: Wohnzimmer Fernseher an: Geht meine FunkSteckdose vom Sat Receiver und Fernseher an.
Wenn ich also sage: "Fernseher Wohnzimmer an" geht durch das Script erst beide Steckdosen an. Sage ich jetzt "Fernseher Wohnzimmer aus" geht durch das Toogle meine Steckdose vom Fernseher und vom Sat Receiver aus.
Wenn ich jetzt "TV aus" sage geht durch das Toogle erstmal nur der Receiver in den Standby. Sage ich "TV an" geht der Receiver wieder aus dem Standby in den normalen Betrieb und durch HDMI mein Fernseher direkt mit.
Jedes mal wird eine Datei erstellt damit überprüft wird ob "an" oder "aus" ist. sieht man ja an dem befehl "touch" in dem Script.
Ich will ja jetzt nur noch das wenn der TV in die Schutzzeit geht, wodurch natürlich dann kein Script ausgeführt wurde und keine Datei erstellt wurde, das, wenn ich sage "TV an" nur mein TV ein Signal bekommt. Also im Prinzip:
Wenn "Datei standby.txt" nicht existiert" dann nur "Fernseher An".
Ich hoffe es wurde ein wenig deutlicher..
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe schon was du willst. Ich halte es halt für Unfug das mit einer komplizierten und daher fehleranfälligen heuristik zu machen. Schaff dir rauf, wie du das Argument "an" bzw "aus" ausgewertet bekommst, und das Ding läuft wie es soll.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,




ich würde einfach, wenn der Fernseher nicht angepingt werden kann immer ein TV ON senden, ansonsten ein TV OFF.
Das dürfte doch so passen?
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

aber dann würde ja, wenn der Fernseher angepingt werden kann, ausgehen :D andererseits, sage ich ja nicht TV an, wenn der Fernseher an ist :D hmm ...
irgendwie komme ich einfach nicht weiter, ich weiss nicht wo ich anfangen soll, geschweige aufhören soll...
ich bin leider noch nicht weiter in der Materie Python und hab halt auch nicht jeden Tag zeit mich dort so extrem einzuarbeiten. Ich bin ja schon froh das ich momentan die Scripte soweit fertig habe, wie ich es bisher auch haben wollte..
BlackJack

@4-Real: Wobei man bezüglich Python ja sagen muss, dass das Programm das Du da gezeigt hast kein Python ist. Wenn man eh nur `os.system()`-Aufrufe absetzt wo jedes mal eine Shell für gestartet wird, kann man auch gleich ein Shell-Skript schreiben (ungetestet):
[codebox=bash file=Unbenannt.bsh]#!/bin/bash
readonly STANDBY_PATH='/home/steckdosen/codes/standby.txt'
readonly REMOTE='vusolo'

send_key() { irsend SEND_ONCE "$REMOTE" "$1"; }

send_key KEY_POWER
if [ -e "$STANDBY_PATH" ]; then
rm "$STANDBY_PATH"
else
sleep 1
send_key KEY_3
sleep 1
touch "$STANDBY_PATH"
fi[/code]
Dabei fiel mir übrigens auf, dass Du in Deinem Programm den Pfad zur Datei mehrfach geschrieben hast, statt den Namen zu verwenden an den Du ihn am Anfang bindest.

Wenn schon Python, dann nicht `os.system()` sondern das `subprocess`-Modul verwenden. Und auch nur für Sachen für die man tatsächlich externe Prozesse benötigt. Dateien löschen und anlegen kann man auch in Python. Da muss man kein externes Programm für starten.

Edit: Senden eines Codes in eine Funktion ausgelagert.
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

ich danke dir erstmal dafür! ich werde es im laufe des Tages mal testen! :-)
ja du hast recht, ich benutze natürlich nur teile von Python, aber irgendwie laufen bei mir die python script Variante besser als die Linux Shell Script Variante, warum auch immer.
Ich bin halt noch ganz ganz neu und versuche ganz langsam mit den Elementen anzufangen. Bei dir fällt mir jetzt aber auf, das durch deine Variante im Prinzip genau das gleiche Problem besteht wie bei mir am Anfang schon. Das Script versteht halt nicht das nur mein Fernseher von Alleine Ausgegangen ist (schutzzeit) und versucht dann natürlich nur meinen Receiver, das Signal zu geben.
Ich will ja das dass Script versteht, weil keine Standby.txt vorhanden ist, das mein Receiver ja an ist und nur mein Fernseher ausgegangen ist, und dann nur den irsend befehl für den Samsung Fernseher ausführt.. Das ist alles ein Bisschen kompliziert, ja :D
Das Script soll halt merken wenn ich sage:
"TV Aus" : Receiver Standby schalten > Fernseher geht durch HDMI aus > Standby.txt wird erstellt.
"TV an" : Script weiß durch Standby.txt das Receiver im Standby ist > Receiver An > Fernseher geht durch HDMI wieder mit an > Standby.txt wird gelöscht. (also eine Art Toogle, durch das erstellen und löschen der Datei.)
"TV an" : Fernseher ist durch Schutzzeit ausgegangen > daher keine Standby.txt Datei vorhanden > Script soll verstehen das Standby.txt nicht vorhanden ist und nur den IR Befehl für Fernseher senden.

Ich verstehe das es alles ein wenig crazy ist, was ich vorhabe..Aber irgendwie möglich muss das ja sein..

Vielen dank schonmal an alle die geholfen haben!
BlackJack

@4-Real: Meine Variante ist ja auch nur Dein Python-Programm als Bash-Skript. Es ging darum zu zeigen das Du eigentlich gar kein Python-Programm geschrieben hast, sondern nur ein Bash-Skript als Python ”verkleidet” hast. In Python würde das eher so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
import os
from subprocess import call
from time import sleep

STANDBY_PATH = '/home/steckdosen/codes/standby.txt'
REMOTE = 'vusolo'


def send_key(key_name):
    call(['irsend', 'SEND_ONCE', REMOTE, key_name])


def main():
    send_key('KEY_POWER')
    if os.path.exists(STANDBY_PATH):
        os.remove(STANDBY_PATH)
    else:
        sleep(1)
        send_key('KEY_3')
        sleep(1)
        with open(STANDBY_PATH, 'ab'):
            pass


if __name__ == '__main__':
    main()
Das hat natürlich immer noch das gleiche Problem. Aber ich bin da auch der Meinung von Vorrednern, das man das anders als mit komplizierten Zuständen und Tests lösen sollte.
4-Real
User
Beiträge: 7
Registriert: Montag 1. Mai 2017, 15:52

so, also, inzwischen habe ich es endlich geschafft, auch wenn du mich natürlich darauf hinweist das es ein bash script in python verkleidet ist.
daran lässt sich dann aber natürlich noch arbeiten, oder? :)

Code: Alles auswählen

#!usr/bin/python

import os
import time
import pyping

standby='/home/steckdosen/codes/standby.txt'
r = pyping.ping('192.168.178.54')

if os.path.exists(standby):
	os.system('irsend SEND_ONCE vusolo KEY_POWER')
	print("Standby.txt vorhanden! VU Solo Anschalten")
	os.system('rm /home/steckdosen/codes/standby.txt')
elif r.ret_code == 0:
	print("Fernseher Erreichbar - Standby Anschalten!")
	os.system('irsend SEND_ONCE vusolo KEY_POWER')
	time.sleep(1)
	os.system('irsend SEND_ONCE vusolo KEY_3')
	time.sleep(1)
	os.system('touch /home/steckdosen/codes/standby.txt')
else:
	print("Fernseher Nicht Erreichbar! nur Schutzzeit - Anschalten")
	os.system('irsend SEND_ONCE samsung KEY_POWER')
mit subprocess würde ich dann jetzt langsam mal anfangen. Klar, ein Python Script ist es ansich dann auch immer noch nicht, ganz ehrlich fehlt mir dann aber auch momentan das wissen und die Zeit, alles als ein Reines Python Script zu schreiben..
Ich danke euch trotzdem erstmal für die Hilfe!!
BlackJack

Mal was ganz anderes: Beim Titel dieses Themas muss ich immer an Bo Schaf von Orson's Farm denken:
Bild
Was soll der denn tatsächlich bedeuten? :-)
Antworten