DeaD_EyE icon

Pumpe

DeaD_EyE | PRO | 03/02/24 10:31:49 PM UTC | 0 ⭐ | 1683 👁️ | Never ⏰ | []
Python |

4.03 KB

|

None

|

0 👍

/

0 👎

import time
from enum import Enum
from dataclasses import dataclass, field
 
from rich import get_console
 
from wled import set_level
 
 
console = get_console()
 
 
class Direction(str, Enum):
    a_to_b = "A to B"
    b_to_a = "B to A"
 
 
@dataclass
class Height:
    min : int | float
    max : int | float
    step : int | float = field(default=1)
 
    def __post_init__(self):
        self._value = 50.0
        console.print("Height measurement initialized")
        console.print(f"Min-Height: {self.min} mm")
        console.print(f"Max-Height: {self.max} mm")
        console.print(f"Step: {self.step} mm")
        console.print(f"Value: {self.value:.2f} mm")
 
    @property
    def value(self) -> int | float:
        return self._value
 
    @value.setter
    def value(self, value):
        console.print("Setting new height to:", value)
        self._value = value
 
    @property
    def ok(self) -> bool:
        return self.min <= self.value <= self.max
 
    @property
    def min_ok(self) -> bool:
        return self.min < self.value
 
    @property
    def max_ok(self) -> bool:
        return self.max > self.value
 
    def update(self, direction: Direction | None) -> int | float:
        if direction is Direction.a_to_b:
            self._value -= self.step
        elif direction is Direction.b_to_a:
            self._value += self.step
 
 
@dataclass
class Pumpe:
    name : str
 
    def __post_init__(self):
         self._state = None
         console.print(f"Created {self.name}.")
 
    @property
    def state(self) -> Direction:
        return self._state
 
    def a_to_b(self):
        self._state = Direction.a_to_b
        console.print(f"{self.name}: {self._state.value}")
 
    def b_to_a(self):
        self._state = Direction.b_to_a
        console.print(f"{self.name}: {self._state.value}")
 
    def stop(self):
        self._state = None
        console.print(f"{self.name}: Stop")
 
 
 
def main():
    delay = 0.01
    step_size = (140 / 14) * delay
    console.print(f"Simulation with step_size of {step_size:.2f} and a delay of {delay:.3f}s")
 
    height = Height(min=15.0, max=100.0, step=step_size)
    height.value = 100.0
 
    pumpe = Pumpe("Pupe 1")
 
    console.print("Starting main loop")
    step = 0
    timer = 1.0
 
    while True:
        time.sleep(delay)
 
        height.update(pumpe.state)
        console.print(f"Height: {height.value:.2f}")
        console.print("\nStep:", step)   
        set_level(height.value, min_value=0.0, max_value=140.0)
 
        #  0 [      start  ] -> Pumpe stoppen | ->  1
 
        #              Verzweigung
        #  1 [      max_ok ] -> Von b nach a  | -> 10
        #  1 [ not max_ok  ] -> Von a nach b  | -> 20
 
        #              von b nach a
        # 10 [ not max_ok  ] -> Pumpe stoppen | -> 11
        # 11 [ time 4 s    ] ->               | -> 20
 
        #              von a nach b
        # 20 [             ] -> Von a nach b  | -> 21
        # 21 [  not min_ok ] -> Pumpe stoppen | -> 30
 
        # 30 [             ] ->               | ->  0
 
        match step:
            case 0:
                step = 1
                pumpe.stop()
                input("Enter to start: ")
 
            case 1 if height.max_ok:
                step = 10
                pumpe.b_to_a()
 
            case 1 if not height.max_ok:
                step = 20
                pumpe.a_to_b()
 
            case 10 if not height.max_ok:
                step = 11
                pumpe.stop()
 
            case 11:
                step = 20
                console.print(f"Delay of {timer}s")
                time.sleep(timer)
 
            case 20:
                step = 21
                pumpe.a_to_b()
 
            case 21 if not height.min_ok:
                step = 30
                pumpe.stop()
 
            case 30:
                step = 0
 
 
if __name__ == "__main__":
    console.print("Starting simulation")
    try:
        main()
    except KeyboardInterrupt:
        print()
 
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎