genau das war es. Ich bedanke mich nochmal bei euch beiden und reiche mal ein virtuelles Bier oder Kaffee in die Runde.
schönes Wochenende noch
Frank
Beiträge von firstfacility
-
-
geht leider nicht der Fehler bleibt. -
hm, blicke grad nicht durch...
Codewhile 1: current_value = wert() if current_value < 10.0 and last_value > 10: Message() last_value = current_value time.sleep(4)
das läuft aber das nicht ...
Code
Alles anzeigendef Thread(): global current_value current_value = wert() print "starte thread" while 1: if current_value < 10 and last_value >10: Message() last_value = current_value time.sleep(4) th1=threading.Thread(target=Thread) th1.start()
Was mache ich falsch ?
-
danke, danke, danke..... genau das läuft. Eine Kleinigkeit vielleicht wenn ich das in einem Thread laufen lassen möchte:
Code
Alles anzeigendef Thread(): current_value = wert() global current_value print "starte thread" while 1: if current_value < 10 and last_value >10: Message() last_value = current_value time.sleep(4) th1=threading.Thread(target=Thread) th1.start()
bekomme ich einen Fehler:Code
Alles anzeigenSyntaxWarning: name 'current_value' is assigned to before global declaration global current_value starte thread Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) File "fritzl.py", line 36, in Thread if current_value < 10 and last_value >10: UnboundLocalError: local variable 'last_value' referenced before assignment
-
wieso?
Schau mal hier:1. 0 - 4 Sek.: Messwert 11 => Keine Meldung
2. 4 - 8 Sek.: Messwert 9.7 => Meldung & last_value auf 9.7 setzen
3. 8 -12 Sek.: Messwert 9.5 => Keine Meldung, da last_value < 10.0
4. 12-16 Sek.: Messwert 10.5 => keine Meldung, last_value wieder löschen
5. 16-20 Sek.: Messwert 12 => keine Meldung
6. 20-24 Sek.: Messwert 9.8 => Meldung & last_value auf 9.8 setzenSo soll es wohl sein, oder?
bin begeistert, stimmt so soll es sein. Hättest du noch ein Stück code für mich ?
-
Hallo firstfacility,ich würde dem Programm-Ausschnitt noch eine weitere Variable gönnen, z.B. last_value. Diese wird bei Aufruf von message() auf den Wert von current_value gesetzt. message() wird aber nur aufgerufen, wenn last_value <= 10.0 UND current_value < 10.0 ist.
Liefert Deine Funktion wert() einen Wert im Abstand von 4 Sekunden - oder wird hier der Mittelwert über diesen 4Sekunden-Zeitraum ermittelt?
Beste Grüße
Andreas
Hallo Andreas,ich bekomme einen Mittelwert über 4 Sek. Dein Vorschlag würde mein Problem um einen Durchlauf nach hinten setzen oder ?
schöne Grüße
Frank -
der wert() wird alle 4 Sek erneuert, und je nach dem welche aktuelle Leistung grade anliegt kommt immer der gleiche Wert, bis sich eben etwas verändert. Dies kann innerhalb der Zeit time.sleep sein oder auch nicht. Von daher leider keinen Erfolg.
Aber Danke für den Versuch. -
Hi,
also nur um erstmal die Gedanken zu sortieren und weil du immer von einer Schleife und dem else-Teil schreibst. Du hast in deinem Script eine while-Schleife, eine if-else-Anweisung und eine for-Schleife. while-Schleife um auf den Wert zu warten, ok. if-Anweisung, um den Wert zu prüfen, ok. Das continue im else-Teil ist überflüssig, da ist nichts mehr zu überspringen. Aber wenn der Event (Message()?) nur einmal ausgeführt werden soll, warum dann in eine for-Schleife, die bis 1 zählt?. Die for-Schleife ist für mich unnütz.Woran erkennst du, dass der if-Teil 'unendlich' ausgeführt wird? Wird dann Message() auch unendlich ausgeführt? Der if-Teil kann eigentlich gar nicht unendlich ausgeführt werden, sondern es ist die while-Schleife, die immer wieder durchlaufen wird. Aber sobald die if-Bedingung eintritt müsste nach Message() die break-Anweisung die while-Schleife beenden.
Gruß
ja ist etwas verzwickt, meine Idee war hat über die for Schleife nur einen Aufruf zu starten, aber klar ist unnütz. Wenn ich die for schleife rausnehme ändert sich auch nichts. Auf den else Teil könnte ich wohl ganz verzichten ? Wichtig ist für mich das "Message" nur einmal aufgerufen wird wenn der schwellenwert <10 unterschritten wird die Schleife aber aktiv bleibt und beim nächsten unterschreiten des Schwellenwertes wiederum "Message" ausgeführt wird.
Das wäre dann erst mal so aber hierdurch wird die Schleife beendet.
-
Make läuft eigentlich nach deiner Aussage ordentlich durch.
Versuche mal Telegram zu starten.Also ein: /bin/telegram-cli -k tg-server.pub -v 3 bringt:
Code
Alles anzeigenchange_user_group: can't find the user telegramd to switch to Telegram-cli version 1.3.3, Copyright (C) 2013-2015 Vitaly Valtman Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'. This is free software, and you are welcome to redistribute it under certain conditions; type `show_license' for details. Telegram-cli uses libtgl version 2.0.3 Telegram-cli includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/) Telegram-cli uses libpython version 2.7.3 I: config dir=[/root/.telegram-cli] *** Couldn't open public key file: /etc/telegram-cli/server.pub *** Can not load key /etc/telegram-cli/server.pub *** adjusting CLOCK_MONOTONIC delta to -4.633208 *** adjusting CLOCK_MONOTONIC delta to -2.331279 *** adjusting CLOCK_MONOTONIC delta to -1.295200 *** adjusting CLOCK_MONOTONIC delta to -3.142071 *** fail connection: reason: ping timeout > telegram-cli: tgl/mtproto-client.c:1250: tc_becomes_ready: Assertion `0' failed. SIGNAL received
Wie richte ich denn nun eine neue Rufnummer ein ?
-
Hallo Forum,
ich frage mit meinem Script den Stromverbrauch ab und möchte einen Event auslösen wenn der Verbrauch einen Schwellenwert unterschreitet. Das allerdings nur einmal, dafür habe ich es mit einer Schleife versucht:
Codewhile 1: current_value = wert() if current_value < 10.0: for i in [1]: Message() break else: continue
Der else Teil läuft wie gewünscht, also wert > 10 mache nichts und warte, aber der If Teil wird entweder unendlich ausgeführt, oder die Schleife beendet sich nach dem Message() einmal ausgeführt wurde.
Ist die Schleife der richtige weg für mich ? Ich weiß das es für die GPIO´s einen Interrupt gibt der die Veränderung feststellt, aber so etwas läuft wohl hierfür nicht. Hätte jemand noch eine Idee ?Gruß
Frank -
Vielen Dank für deine Hilfe, diesen teil habe ich hinbekommen.
Gruß
Frank -
Es gibt einen syntaktischen Unterschied ob Du auf die Variable wert zugreifst oder die Funktion wert aufrufst.
Deine Funktionsdefinition von wert erwartet noch einen Parameter (str) der in der Funktion nicht benutzt wird. Ein ähnliches Problem hattes Du schon weiter oben. Irgendwie sieht mir Dein Code nach copy & paste aus ohne das Du verstehst was er eigentlich bewirkt.Jep, du beschreibst mein Problem sehr präzise. Wenn du das so meinst :
def wert(str):
Funktioniert nur leider auch nicht.....
Ich versuche schon zu verstehen was ich da mache, aber ich gebe zu, dass ich von Python keine Ahnung habe, aber deshalb frage ich dich/euch ja um Hilfe zu bekommen. Wenn mir dann noch jemand sagt was ich falsch mache bin ich ja schon glücklich. Ist das der falsche Ansatz ?
-
Ich weiß nicht, ob es hilft, aber probier mal int(wert) statt nur wert.
Finde leider keine Codeblöcke.leider keine Änderung , vielleicht findest du ja noch etwas
-
Leider läuft es nicht so wie gewollt. Der Stromverbrauch wird immer nur einmal eingelesen und Veränderungen bleiben unberücksichtigt. Ich bin heute nochmal von vorn angefangen und habe die Abfrage der Daten in eine Datei ausgelagert. Nun mache ich folgendes:
Codedef wert(str): value = "temptrok.py" execfile (value) time.sleep(10) return value while 1: print wert(hex) time.sleep(10)
Als Ausgabe bekomme ich nun meine Leistungswerte:
root@todesstern:~l# python versuch.py
0.0
0.0
38.26
usw
So weit so gut, wenn ich nun aber den Wert nutzten will passiert nichts:Codedef wert(str): value = "temptrok.py" execfile (value) time.sleep(10) return value if wert < 10: print "aus"
Bei einer Leistung von 0 müsste nun "aus" geschrieben...wird aber nicht. Ich denke er kann mit dem Wert nichts anfangen. Was kann ich tun ?
-
Code
Alles anzeigendef my_callback(channel): leistung = (float(wert)) / 1000) leistung = DECK() if leistung < 10(channel): print "Maschine aus" return [True, leistung] else: print "Maschine an" return [True, leistung] result = my_callback() print "leistung: %s" % (result[1]) print "Status %s" % (result[0])
[/quote]Vielen Dank für deine Hilfe. Ich vermute du meinst das so wie oben ?
Ich bekomme in beiden Varianten einen Fehler:
result = my_callback()
TypeError: my_callback() takes exactly 1 argument (0 given) -
jep
dabei kommt dann :
<function my_callback at 0xb68ebcf0> -
ich habe den Code als Text angefügt. Ich frage mit "wert" eine Leistung ab. Wenn ich mit print wert die Daten abfrage bekommen ich die richtige Leistung angezeigt.
Ich habe versucht über eine while Schleife bei Veränderung eine Aktion auszulösen.Geht nur nicht, da er die Veränderung nicht mitbekommt. Ich habe es mit < 10 definiert. Also kleiner 10 mache dies größer 10 mache das. Das Läuft aber nicht da die Veränderung durch erneutes Aufrufen von "wert" erfolgen muss. Von daher dachte ich mir ich definiere einen callback channel.
Ich bekomme es aber nicht hin das der Wert von zB 35 übernommen wird sondern es wird nur der Hex Wert übergeben, und das bringt mich nicht weiter.
Liege ich da falsch ?
-
Hallo Forum,
ich habe ein Problem mit einen Script bei dem ich nicht weiterkomme, vielleicht kann mir jemand helfen. Ich frage einen Wert ab mit dem ich eine Aktion auslösen möchte:def my_callback(channel):
leistung = (float(wert(dev_id)) / 1000)
if leistung < 10(channel):
print "Maschine aus"
return True
else:
print "Maschine an"
return Trueprint wert
print my_callbackWenn ich das Script ausführe bekomme ich für den "wert" eine Zahl zb. 35. Allerdings läuft das ganze nicht da der wert für die Variable my_callback in Hex ausgegeben wird:
<function my_callback at 0x4f6d30>
Was mache ich falsch ?Gruß
Frank -
Hallo,
bei mir wird make abgebrochen, kann mir jemand sagen was ich falsch mache ?
Gruß
Frank -
Hallo Forum,
ich möchte gern anhand des aktuellen Stromverbrauchs eines Gerätes eine Session auslösen. Hierzu habe ich eine Steckdose von AVM gefunden die Dect200 die den aktuellen Stromverbrauch missen kann. Soweit ich es bisher verstanden habe kann ich über eine API die Steckdose schalten bzw auslesen. Was ich bisher gefunden habe sin PHP Scripts die das übernehmen. In Python findet Google auch etwas wie zB. Fheim aber die sagen nicht wie sie es gemacht haben. Hätte jemand einen Tipp wo ich mich einlesen kann, oder ein Beispiel das mir helfen könnte ?Gruß
Frank