Seite 1 von 1
Bedingung innerhalb einer Bedingung
Verfasst: Sonntag 8. November 2015, 21:20
von BaggerBodo
Hallo.
Seit ich das letzte mal programmiert habe sind 13 Jahre vergangen. Demzufolge habe ich null Plan mehr.
Ich habe hier ein Script, welches ein externes Board am Raspi steuert und das muss etwas abgeändert werden und nun hoffe ich auf Hilfe von euch.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from lib.utils import *
from lib.hvac_hal import HvacIO
loop = Loop()
timer_sec = IntervalTimer(1)
io = HvacIO()
print("Raspberry-HVAC, DEMO1, (www.emsystech.de)")
while 1:
if (timer_sec.is_event()): # 1x pro Sekunde
io.read_all_inputs() # alle Eingänge erfassen
temp = io.get_input(1, "NTC_10K") # Temperatur
if(temp > 57):
io.o1 = True
# io.o2 = True
else:
io.o1 = False
print("Temperature:",temp,"°C o1:",io.o1," Switch:",switch," o2:",io.o2)
io.update_output() # Ausgänge auf Hardware ausgeben
loop.sleep(0.01) # Loop @ 10ms if view == '1':
Soweit bis jetzt und alles läuft. Den Ausgang o2 schalte ich derzeit per Hand in dem ich gelegentlich das # entferne.
Gut wäre allerdings wenn das automatisch ginge. Sprich 2. Temperatureingang abfragen und schalten. Also o2 soll nur schalten wenn o1 läuft und temp2 <35 bis 50 und dann erst wieder bei <35 bis 50 usw.
Ich hoffe man versteht was ich will. :K
Kann man das irgendwie in das obere Script einbauen oder bin ich völlig auf dem Holzweg?
mfg
Re: Bedingung innerhalb einer Bedingung
Verfasst: Sonntag 8. November 2015, 22:53
von __deets__
Ich versteh nur Bahnhof was da welche Temperatur bei welcher Bedingung schalten soll. Beschreib doch mal, was da eigentlich genau passieren soll.
Re: Bedingung innerhalb einer Bedingung
Verfasst: Sonntag 8. November 2015, 22:58
von cofi
Willkommen im Forum!
Wie auch __deets__ verstehe ich nicht wirklich, wann was geschaltet werden soll.
Ich will dich aber noch darauf hinweisen, dass du bereits eine "Bedingung innerhalb einer Bedingung" hast und wie du sehen kannst ist da nichts spezielles dran.
Re: Bedingung innerhalb einer Bedingung
Verfasst: Montag 9. November 2015, 00:19
von BaggerBodo
Da werden Wasserpumpen angesteuert. io.o1 ist Pumpe 1 und die wird mittels Sensor bei >57 angeschalten.
Ich habe allerdings noch eine zweite Pumpe, io.o2, die ich mit einem 2. Sensor bei einer Temperatur von unter 30 Grad bist 50 Grad schalten will und dann erst wieder wenn die Temperatur wieder unter 30 fällt.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from lib.utils import *
from lib.hvac_hal import HvacIO
loop = Loop()
timer_sec = IntervalTimer(1)
io = HvacIO()
print("Raspberry-HVAC, DEMO1, (http://www.emsystech.de)")
while 1:
if (timer_sec.is_event()): # 1x pro Sekunde
io.read_all_inputs() # alle Eingänge erfassen
temp = io.get_input(1, "NTC_10K") # Temperatur
temp2 = io.get_input(2, "NTC_10K") # Temperatur
if(temp > 57):
io.o1 = True
# hier soll dann temp2 abgefragt und evl. pumpe 2 geschaltet werden
else:
io.o1 = False
print("Temperature:",temp,"°C o1:",io.o1," Switch:",switch," o2:",io.o2)
io.update_output() # Ausgänge auf Hardware ausgeben
loop.sleep(0.01) # Loop @ 10ms if view == '1':
Oben habe ich mal eingefügt, wie ich mir das vorstelle, hab aber Null Ahnung wie ich das in Code machen soll.
Jetzt verständlicher? :K
Danke für eure Hilfe!
Re: Bedingung innerhalb einer Bedingung
Verfasst: Montag 9. November 2015, 08:51
von Sirius3
@BaggerBodo: am besten zeichnest Du Dir das Problem in Form eines Zustandsautomaten auf Papier auf. Es gibt vier Zustände, Pumpe 1 und 2 aus, Pumpe 1 an, Pumpe 2 an und Pumpe 1 und 2 an. Zwischen den Zuständen wird gewechselt, wenn die Temperatur-Sensoren bestimmte Bedingungen erfüllen. Wenn Pumpe 1 und Pumpe 2 unabhängig voneinander sind, zerfällt der Automat und die Sache wird natürlich noch einfacher.
Re: Bedingung innerhalb einer Bedingung
Verfasst: Dienstag 10. November 2015, 14:53
von BaggerBodo
Danke für die Anregung. Ich habe das mal irgendwie in Code gefasst, wie ich denke.
Das 2. if hängt ja von drei Temperaturen ab, wobei eben die Schaltung bei temp3 bei 35 aktiv werden soll bis 50 und und dann eben erst wieder wenn die Temperatur unter 35 gefallen ist wieder angehen soll.
Geht das überhaupt? :K
Ich bin für jede Hilfe dankbar.
Code: Alles auswählen
if(temp > 57):
io.o1 = True
else:
io.o1 = False
if(temp > 57, temp2 > 50, temp3 <35 ):
io.o1 = True
io.o2 = True
else:
io.o1 = False
io.o2 = False
Re: Bedingung innerhalb einer Bedingung
Verfasst: Dienstag 10. November 2015, 15:00
von BlackJack
@BaggerBodo: Gehen tut das sicher, aber wie schon gesagt wurde müsste man mal formal erfassen was wann passieren soll. Zum Beispiel als
Zustandsautomat.
Re: Bedingung innerhalb einer Bedingung
Verfasst: Freitag 13. November 2015, 16:13
von BlackJack
Ich versuchs nochmal…
Es soll abhängig von den äusseren Bedingungen, also hier von Temperaturen, der Zustand des Programms geändert werden. Als Zustand haben wir mindestens die beiden Schalter die an oder aus sein können und als Ereignisse, die diesen Zustand ändern können, sollen bestimmte Temperaturmessergebnisse, von zwei oder drei Sensoren dienen. Die ersten Beiträge klingen nach zwei Sensoren; im letzten gezeigten Quelltextschnippsel taucht ein `temp3`-Wert auf.
Die Schalter können insgesamt maximal vier Zustände einnehmen, wobei die Beschreibung nahelegt das Schalter 2 nur an sein darf wenn auch Schalter 1 an ist, was die Zustände auf drei Möglichkeiten reduziert. Zusätzliche Variablen muss man dafür noch nicht einführen weil man die Schalter nicht nur setzen, sondern auch auslesen kann.
Der Zusammenhang zwischen dem ersten Temperatursensor und dem ersten Schalter ist ja recht einfach.
[Codebox=text file=Unbenannt.txt]foo[/Codebox]
[codebox=python file=Unbenannt.txt]. t₁≤57
┌─────────────────┐
∨ │
┌──────┐ ┌──────┐
│ o₁=0 │ t₁>57 │ o₁=1 │
│ o₂=0 │ ───────> │ o₂=0 │
└──────┘ └──────┘[/code]
Aber beim zweiten Temperatursensor ist mir, und wahrscheinlich auch den anderen Lesern, nicht klar was die Beschreibung bedeuten soll. Was genau soll „temp2 <30 bis 50“ bedeuten? Soll der schalten wenn die Temperatur kleiner 30—50 ist? Das ist doch irgendwie das gleiche wie einfach nur <30 denn jeder Wert kleiner 30 ist auch kleiner als die Werte 30 bis 50‽ Oder meint diese Formulierung das die zweite Pumpe bei weniger als 30 Grad anspringen soll und dann solange laufen soll bis 50 Grad erreicht sind, danach das nächste mal aber erst wieder anspringen soll wenn die Temperatur wieder unter 30 Grad gefallen ist? Das könnte als Zustandsautomat dann so aussehen:
[codebox=python file=Unbenannt.txt]. t₁≤57
┌──────────────────────────────┐
∨ │
┌───────────────────┐ │
│ o₁=0 │ │
│ o₂=0 │ <┐ │
└───────────────────┘ │ │
│ │ │
│ t₁>57 │ t₁≤57 │
∨ │ │
┌───────────────────┐ │ │
│ o₁=1 │ │ │
┌─────────────> │ o₂=0 │ ─┘ │
│ └───────────────────┘ │
│ │ │
│ t₁>57 ∧ t₂≥50 │ t₁>57 ∧ t₂<30 │
│ ∨ │
│ ┌───────────────────┐ │
│ │ o₁=1 │ │
└────────────── │ o₂=1 │ ───────────┘
└───────────────────┘
∧ t₁>57 ∧ t₂<50 │
└───────────────┘[/code]
Die Frage ist ob das so gemeint ist und alle Bedingungen korrekt erfüllt‽
Re: Bedingung innerhalb einer Bedingung
Verfasst: Dienstag 17. November 2015, 20:21
von BaggerBodo
Also erst mal vielen Dank für deine Mühe! Hatte leider in den letzten Tagen recht viel um die Ohren und melde mich erst jetzt.
BlackJack hat geschrieben: Oder meint diese Formulierung das die zweite Pumpe bei weniger als 30 Grad anspringen soll und dann solange laufen soll bis 50 Grad erreicht sind, danach das nächste mal aber erst wieder anspringen soll wenn die Temperatur wieder unter 30 Grad gefallen ist?
Ja, genau das meine ich.
Inzwischen sind auch alle Sensoren angekommen und verlegt, somit hat sich der Code leicht verändert.
Vom Grundprinzip her aber gleich. Und wie du sagst von zwei Sensoren abhängig, temp5 und temp4, der Rest ist nur zur Überwachung und soll später noch visualisiert werden aber alles vorerst nicht wichtig.
Und vielen Dank für den Zustandsautomaten, das müsste so hinhauen.
So viel zur Theorie, hilft du mir noch das Ganze in Code zu fassen? :K
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from lib.utils import *
from lib.hvac_hal import HvacIO
loop = Loop()
timer_sec = IntervalTimer(1)
io = HvacIO()
print("Raspberry-HVAC, Tagschaltung")
while 1:
if (timer_sec.is_event()): # 1x pro Sekunde
io.read_all_inputs() # alle Eingänge erfassen
temp = io.get_input(1, "NTC_10K") #
temp2 = io.get_input(2, "NTC_10K") # Temperatur Vorlauf
temp3 = io.get_input(3, "NTC_10K") # Temperatur Ruecklauf
temp4 = io.get_input(4, "NTC_10K") # Temperatur WWasser
temp5 = io.get_input(5, "NTC_10K") # Temperatur Ofen
temp6 = io.get_input(6, "NTC_10K") # Temperatur Abgastemp
temp7 = io.get_input(7, "NTC_10K") # Temperatur Puffer
temp8 = io.get_input(8, "NTC_10K") # Temperatur Raumtemp
if(temp5 > 67):
io.o1 = True
# io.o2 = True
else:
io.o1 = False
io.o2 = False
import time
localtime = time.asctime( time.localtime(time.time()) )
import sys
sys.stdout = open("/home/pi/hvac/www/isttemp.txt", "w")
print("",localtime,"\n\n\n Vorlauf:",temp2,"\n Ruecklauf:",temp3,"\n Warmwasser:",temp4,"\n Ofen1:",temp5,"\n Abgas:",temp6,"\n Puffer:",temp7,"\n Waschhaus:",temp8,"\n Vorlaufpumpe:",io.o1,"\n WW-Pumpe:",io.o2)
io.update_output() # Ausgänge auf Hardware ausgeben
loop.sleep(0.01) # Loop @ 10ms if view == '1':