Temperatursteuerung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Mittwoch 26. Juli 2017, 08:34

@ schneiderre
Ich spiele auch ab und zu (wenn auch unter völlig anderen Rahmenbedingungen) mit einer Heizmatte rum. Dabei ist mir mal unbemerkt ein Relais kaputt gegangen und "plötzlich" war meine Heizplatte über 120°C warm, Tendenz steigend...
Damit will ich auch nur sagen, dass noch schlimmere Sachen passieren können, als dass sie nur nicht mehr heizt...
Benutzeravatar
kbr
User
Beiträge: 914
Registriert: Mittwoch 15. Oktober 2008, 09:27

Mittwoch 26. Juli 2017, 08:42

@Melewo: Ergänzend: Der Code ist nicht nur keine Hysterese sondern auch überkompliziert und funktioniert analog zu:

Code: Alles auswählen

def update(self, temp_heizmatte):
    return temp_heizmatte <= self.temp_heizmatte_min
Kompakt und richtig wäre:

Code: Alles auswählen

def update(self, temp_heizmatte):
    if temp_heizmatte <= self.temp_heizmatte_min:
        self.state = True
    elif temp_heizmatte >= self.temp_heizmatte_max:
        self.state = False
    return self.state
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 09:59

@kbr: Ist beides nicht richtig. Es geht ja darum, dass die weniger oft anspringt und weniger oft schaltet. Und somit bei 3 bei 26 bis 29 Grad weiterläuft, falls gerade am Laufen und aus bleibt, falls nicht gerade am Laufen. Nur soweit habe ich heute Morgen noch nicht gedacht. Der aktuelle Stand, ob am Laufen oder nicht, müsste somit mit verglichen werden.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Mittwoch 26. Juli 2017, 10:22

Melewo hat geschrieben:@kbr: Ist beides nicht richtig. Es geht ja darum, dass die weniger oft anspringt und weniger oft schaltet. Und somit bei 3 bei 26 bis 29 Grad weiterläuft, falls gerade am Laufen und aus bleibt, falls nicht gerade am Laufen. Nur soweit habe ich heute Morgen noch nicht gedacht.
Ich behaupte jetzt einfach mal, dass das Programm von kbr genau das macht :wink:
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 10:26

Zizibee hat geschrieben:Ich behaupte jetzt einfach mal, dass das Programm von kbr genau das macht :wink:
Ich denke eher das von DeaD_EyE. Zumindest findet bei kbr keine Prüfung statt, ob die Heizung gerade läuft oder nicht und der aktuelle Stand müsste ja zwischengespeichert werden.
Zuletzt geändert von Melewo am Mittwoch 26. Juli 2017, 10:35, insgesamt 1-mal geändert.
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Mittwoch 26. Juli 2017, 10:34

Melewo hat geschrieben:Ich denke eher das von DeaD_EyE.
Wo liegt der Unterschied zwischen den Programmen von DeaD_EyE und kbr? Machen die nicht das gleiche?
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 10:37

Zizibee hat geschrieben:
Melewo hat geschrieben:Wo liegt der Unterschied zwischen den Programmen von DeaD_EyE und kbr? Machen die nicht das gleiche?
Es wird nur die Temperatur verglichen, nicht ob die Heizung läuft oder nicht.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 10:54

Habe jetzt nicht alle Varianten durchgespielt, eigentlich nur eine probiert, doch so könnte ich mir das eher vom Prinzip vorstellen.

Code: Alles auswählen

class Hysterese:
    def __init__(self, temp_heizmatte_min, temp_heizmatte_max):
        self.state = False
        self.temp_heizmatte_min = temp_heizmatte_min
        self.temp_heizmatte_max = temp_heizmatte_max
        
    def update(self, temp_heizmatte, status):
        #          24               25
        if temp_heizmatte <= self.temp_heizmatte_min:
            self.state = True
            return self.state
        #          31               30
        elif temp_heizmatte >= self.temp_heizmatte_max:
            self.state = False
            return self.state
        #          25                   von 26 bis 29            30
        elif self.temp_heizmatte_min < temp_heizmatte < self.temp_heizmatte_max:
            if status is "on":
                self.state = True
            elif status is "off":
                self.state = False
            return self.state
 
status = "on"
# status = "off"
hyst = Hysterese(25, 30)
print(hyst.update(27, status)) # False bei 27 und "off" | # True bei 27 und "on"
BlackJack

Mittwoch 26. Juli 2017, 11:07

@Melewo: Die Heizung weiss ja selber ob sie läuft oder nicht beziehungsweise das ist `state`. Deins wird immer komplizierter — unnötig. Zumal Du jetzt auch noch mit globalen Variablen anfängst. Was genau funktioniert denn an kbr's letzter Lösung nicht?

Oh, und Deins hat einen Riesenfehler: ``is``. Das ist nicht das selbe wie ``==``.

Code: Alles auswählen

In [13]: a == b
Out[13]: True

In [14]: a is b
Out[14]: False

In [15]: a
Out[15]: 'böse Falle'

In [16]: b
Out[16]: 'böse Falle'
Benutzeravatar
kbr
User
Beiträge: 914
Registriert: Mittwoch 15. Oktober 2008, 09:27

Mittwoch 26. Juli 2017, 11:08

@Melewo: Die Information, ob die Heizung laufen soll oder nicht, steckt in der Instance-Variablen 'state'. Der ursprüngliche, und von mir übernommene, Methoden-Name 'update' ist irreführend und sollte besser in etwas wie 'should_heat' umbenannt werden, was mit dem boolschen Rückgabewert sinnvoll in Beziehung gebracht werden kann.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 11:23

Genau ob sie laufen soll oder nicht, ist für mich auch in state, so sehe ich das auch. Doch ob sie gerade läuft oder nicht, ist doch nicht in state, sondern in der Datenbank als letzter Wert oder soll abgefragt werden und das sollte zwischen 26 und 29 berücksichtigt werden.
schneiderre hat geschrieben:Die Werte kommen aus einer DB.
Was kommt da sonst aus der DB?

Bei 27 Grad, Heizung läuft, dann laufe weiter.
Bei 27 Grad, Heizung läuft nicht, dann bleibe aus.
BlackJack

Mittwoch 26. Juli 2017, 11:48

@Melewo: Aus der Datenbank kommen die Werte wann geschaltet werden sollte.

Noch mal: Ob sie gerade läuft weiss die Heizung selbst und das ist völlig egal, weil das zur Entscheidung nicht benötigt wird. Noch mal: Was an kbr's Lösung funktioniert denn Deiner Meinung nach nicht? Gib mal einen Beispielverlauf der nicht das macht was er soll!
Zizibee
User
Beiträge: 166
Registriert: Donnerstag 12. April 2007, 08:36

Mittwoch 26. Juli 2017, 12:01

@ Melewo: Da "state" nicht vom Threadersteller sondern von DeaD_EyE eingeführt wurde, ist es wenig wahrscheinlich, dass sie in der ursprünglichen Datenbank auftaucht...

Mal eine Frage, die etwas OT ist:
Sehe ich das anhand der Beispiele richtig, das einfache get- und set- Methoden in Python nicht benutzt werden, da sie schlicht nicht gebraucht werden, da die Objektvariablen nicht privat sind?
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mittwoch 26. Juli 2017, 12:02

Da ich nichts hier habe, um das im praktischen Einsatz nachvollziehen zu können, überlasse ich die praktischen Tests schneiderre.
BlackJack

Mittwoch 26. Juli 2017, 12:09

@Melewo: Mehr als einen Rechner und Python brauchst Du nicht um das auszuprobieren. Der Zustand der Heizung ist immer der von `state`, denn nach `state` richtet sich ja der Pin für den Schalter — der hat immer den gleichen Wert, also reicht die Klasse alleine zum Testen völlig aus.
Antworten