cbpi4 Plugin: Schwimmerschalter

Antworten
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

cbpi4 Plugin: Schwimmerschalter

#1

Beitrag von hiasl »

Hallo zusammen,

ich möchte ein Plugin erstellen, das einen Schwimmerschalter im Läutergrant als Sensor darstellt.
Der Schalter ist an einem GPIO angeschlossen (Falling Edge).
Zunächst soll über den Sensor eine Vollmeldung eingehen. Hierz könnte der Sensor den Wert 1 annehmen, wenn geschaltet. Wäre es auch möglich, eine Dashboard-LED leuchten zu lassen, die ja eigentlich an Aktoren gebunden ist? Hat da jemand einen Tip?

Edit:
Ich habe das mittlerweile geschafft:
Habe einen Dummy-Actor eingerichtet mit dem die LED getriggert wird und beim Sensor einen Aktor eingebunden.

Jetzt fehlt mir noch die Umsetzung dass ein Actor immer dann für eine bestimmte Zeit einen anderen Actor schaltet, wenn der Sensor 1 zeigt. Bin gerade am fummeln.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#2

Beitrag von hiasl »

Hallo zusammen,

ich komme gerade mit dem Actor irgendwie nicht weiter.

Code: Alles auswählen

@parameters([Property.Actor(label="Pump",  description="Select the actor you would like to add a dependency to."),
             Property.Sensor(label="SensorDependency", description="Select the sensor that the base actor will depend upon."),
             Property.Number(label="Time", description="Time in seconds the actor will be triggered for pumping wort.")])

class TimedPump(CBPiActor):
    def on_start(self):
        self.state = False
        self.pump = self.props.get("Pump", None)
        self.sensor_dependency = self.props.get("SensorDependency", None)
        self.time = self.props.get("Time", 0)
        pump_actor = self.cbpi.actor.find_by_id(self.pump)
        sensor_dep = self.cbpi.sensor.find_by_id(self.sensor_dependency)
        self.init = False
        pass

    async def on(self, power=0):
        self.state = True

    async def off(self):
        logger.info("ACTOR %s OFF " % self.pump)
        await self.cbpi.actor.off(self.pump)
        self.state = False

    def get_state(self):
        return self.state

    async def run(self):
        if self.init == False:
            if self.pump is not None:
                await self.cbpi.actor.off(self.pump)
                self.state = False
            self.init = True

        while self.running == True:
            if self.state == True:
                sensor_val = self.cbpi.sensor.get_sensor_value(self.sensor_dependency).get("value")
                try:
                    pump_actor_state = pump_actor.instance.state
                except:
                    pump_actor_state = False

                if (sensor_val == 1) and (pump_actor_state == False):
                    await self.cbpi.actor.on(self.pump)
                    await asyncio.sleep(self.time)
                else:
                    await self.cbpi.actor.off(self.pump)
                Logger.info("Sensor Value = %s" % sensor_val)
            else:
                await asyncio.sleep(1)
Der Code soll als Actor folgendes machen:
Warten auf Sensor Wert 1, dann die Pumpe für x Sekunden laufen lassen. Zwischenzeitlich sollte der Sensor wieder 0 zeigen.
Der Sensor funktioniert. Der Schwimmerschalter wechselt je nach Stellung die Werte 0 und 1.
Kann mit bitte jemand helfen?
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
JackFrost
Posting Freak
Posting Freak
Beiträge: 2984
Registriert: Dienstag 15. Mai 2018, 18:10

Re: cbpi4 Plugin: Schwimmerschalter

#3

Beitrag von JackFrost »

Hi,

was tut der Code schon und was geht noch nicht ?

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#4

Beitrag von hiasl »

JackFrost hat geschrieben: Freitag 15. Juli 2022, 16:24 Hi,

was tut der Code schon und was geht noch nicht ?

Gruß JackFrost
Die def off Funktion funktioniert. Ansonsten eben nichts.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
JackFrost
Posting Freak
Posting Freak
Beiträge: 2984
Registriert: Dienstag 15. Mai 2018, 18:10

Re: cbpi4 Plugin: Schwimmerschalter

#5

Beitrag von JackFrost »

Du willst bei dem Wechsel Sensor 0 auf 1 die Pumpe für x Sekunden laufen lassen , oder ?

Wo wird sensor_val auf 0 gesetzt wenn die Pumpe gestartet wurde ?

Code: Alles auswählen

if (sensor_val == 1) and (pump_actor_state == False):
Die Pumpe ist nicht anderweitig aktiv oder ? Wenn sie das wäre würde sie dann abgeschalten werden.

Am einfachsten machst du das mit einer Flankenerkennung von Sensor_val.
Du brauchst eine Hilfsvariable die den Status speichert die müsste global in der Klasse sein, so das sie gespeichert wird.
Die Erkennung startet die Pumpe bei einer Flanke auf true.

Ich hab schon lang keine Python mehr geschrieben und Python und ich sind keine Freunde daher ist der Code ungetestet.

Code: Alles auswählen

if (sensor_val^sensor_val_old) and (sensor_val == 1)
	await self.cbpi.actor.on(self.pump)
        await asyncio.sleep(self.time)
 else:
        await self.cbpi.actor.off(self.pump)
sensor_val_old = sensor_val
Damit ist es nur von sensor_val abhängig.
Wenn nach den x laufzeit aber der Sensor keine 0 liefert startet die Pumpe nicht mehr neu, da das xor über den alten Zustand 0 bleibt.

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#6

Beitrag von hiasl »

JackFrost hat geschrieben: Freitag 15. Juli 2022, 18:52 Du willst bei dem Wechsel Sensor 0 auf 1 die Pumpe für x Sekunden laufen lassen , oder ?

Wo wird sensor_val auf 0 gesetzt wenn die Pumpe gestartet wurde ?
Hi Jack,
der Sensor wird ausgelesen.

Aktuell habe ich das in folgender Schleife drin:

Code: Alles auswählen

async def on(self, power=None):
        self.state = True
        while self.state is True:
            sensor_val = self.cbpi.sensor.get_sensor_value(self.sensor_dependency).get("value")
            if sensor_val == 1:
                await self.cbpi.actor.on(self.pump)
                await asyncio.sleep(self.time)
            else:
                 await self.cbpi.actor.off(self.pump)
                 await asyncio.sleep(1)
Das klappt nun auch so weit. Folgendes Problem tritt aber nun auf: Beim Aktivieren des Aktors im Dashboard wird dieser erst beim zweiten Mal klicken grün. Ausschalten klappt prima. Ohne die Schleife geht das ganz normal. Was mache ich falsch?

Das ist der Auszug aus dem Log:

Code: Alles auswählen

2022-07-16:00:41:03,854 INFO     [actor_controller.py:16] Power is none << 1. Klick
2022-07-16:00:41:08,971 INFO     [actor_controller.py:16] Power is none << 2. Klick
2022-07-16:00:41:08,974 INFO     [web_log.py:206] 192.168.1.100 [15/Jul/2022:22:41:08 +0000] "POST /actor/gnhfNhALKjuYZ79EfqN9Mq/on HTTP/1.1" 204 98 "http://craftbeerpi:8000/cbpi_ui/static/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0" << jetzt wird er grün
2022-07-16:00:41:13,412 INFO     [__init__.py:105] ACTOR a34yoDBwhevyoAPLM7QZhe OFF
2022-07-16:00:41:13,417 INFO     [web_log.py:206] 192.168.1.100 [15/Jul/2022:22:41:13 +0000] "POST /actor/gnhfNhALKjuYZ79EfqN9Mq/off HTTP/1.1" 204 98 "http://craftbeerpi:8000/cbpi_ui/static/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0" << beim Ausschalten geht er korrekt aus
2022-07-16:00:41:13,875 INFO     [web_log.py:206] 192.168.1.100 [15/Jul/2022:22:41:03 +0000] "POST /actor/gnhfNhALKjuYZ79EfqN9Mq/on HTTP/1.1" 204 98 "http://craftbeerpi:8000/cbpi_ui/static/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0" << was soll das?
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#7

Beitrag von hiasl »

mrhyde hat geschrieben: Samstag 16. Juli 2022, 00:51
Vielleicht hat ja Alex Mal einen kleinen Augenblick, mir Input zu geben?

So wie es aussieht verstehe ich nicht, wie ich die Schleife richtig platziere, um nach dem Aktivieren des Aktors kontinuierlich den zweiten Aktor an und ausschalten kann je nach Wert des Sensors. Obiger Code hat das Problem beim Aktivieren, schaltet aber, sobald der Sensor 1 zeigt. Jedoch funktioniert das Abschalten dann nicht.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
mrhyde
Posting Senior
Posting Senior
Beiträge: 468
Registriert: Mittwoch 7. Juni 2017, 14:16

Re: cbpi4 Plugin: Schwimmerschalter

#8

Beitrag von mrhyde »

hiasl hat geschrieben: Samstag 16. Juli 2022, 07:34
Vielleicht hat ja Alex Mal einen kleinen Augenblick, mir Input zu geben?

So wie es aussieht verstehe ich nicht, wie ich die Schleife richtig platziere, um nach dem Aktivieren des Aktors kontinuierlich den zweiten Aktor an und ausschalten kann je nach Wert des Sensors. Obiger Code hat das Problem beim Aktivieren, schaltet aber, sobald der Sensor 1 zeigt. Jedoch funktioniert das Abschalten dann nicht.
Kannst du das bitte mal in einem Repo ablegen. Dann kann ich es mal klonen und testen.

EDIT:
Und eine genauere Beschreibung, was das plugin machen soll wäre noch hilfreich.

- Was muss der User machen?
- Was soll automatisch gehen?
- Welches Ereignis löst was aus?
Braumeister 20 | Gärung: SS Brewtech 7 Gal BME | Speidel 30 Liter (Konus)
https://github.com/PiBrewing
https://openbrewing.gitbook.io/craftbeerpi4_support/
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#9

Beitrag von hiasl »

mrhyde hat geschrieben: Samstag 16. Juli 2022, 13:39 Kannst du das bitte mal in einem Repo ablegen. Dann kann ich es mal klonen und testen.

EDIT:
Und eine genauere Beschreibung, was das plugin machen soll wäre noch hilfreich.

- Was muss der User machen?
- Was soll automatisch gehen?
- Welches Ereignis löst was aus?
https://github.com/hopfenhuhn/cbpi4_FloatingSwitch

Also das Plugin soll folgendes machen:
Sensor: Abfragen eines GPIO.IN ob ein Schwimmerschalter schließt. (Läutergrant voll)
Der Sensor tut das auch soweit. Im Sensor kann dann noch ein Aktor definiert werden, der anstelle des Sensor Werts (0, 1) eben eine LED im Dashboard zum Leuchten bringt (z.B. Dummy Actor) o.ä.

Actor: Nach seiner Aktivierung soll der Aktor durch kontinuierliches Abrufen des Sensorwerts im Falle von 1 einen weiteren Aktor für eine beliebige Zeit aktivieren, um z.B. den Läutergrand leerzupumpen.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#10

Beitrag von hiasl »

Es kommt mir fast so vor, als wenn die Funktion def run(self) gar nichts macht. Oder wie kann man das prüfen? Die Routine sollte doch eigentlich mit "while self.running is True" dauerhaft weiterlaufen, oder?

Edit: Ich habe das Schalten der Pumpe mal in den Sensor integriert. Da geht das einwandfrei! Ich würde jedoch lieber die Routine in einen Aktor packen, da der Sensor ja eigentlich der falsche Ort dafür ist. Außerdem kann man einen Aktor an und ausschalten und ist somit nicht vom Sensor dauerhaft abhängig.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
mrhyde
Posting Senior
Posting Senior
Beiträge: 468
Registriert: Mittwoch 7. Juni 2017, 14:16

Re: cbpi4 Plugin: Schwimmerschalter

#11

Beitrag von mrhyde »

hiasl hat geschrieben: Dienstag 19. Juli 2022, 00:20 Es kommt mir fast so vor, als wenn die Funktion def run(self) gar nichts macht. Oder wie kann man das prüfen? Die Routine sollte doch eigentlich mit "while self.running is True" dauerhaft weiterlaufen, oder?

Edit: Ich habe das Schalten der Pumpe mal in den Sensor integriert. Da geht das einwandfrei! Ich würde jedoch lieber die Routine in einen Aktor packen, da der Sensor ja eigentlich der falsche Ort dafür ist. Außerdem kann man einen Aktor an und ausschalten und ist somit nicht vom Sensor dauerhaft abhängig.
self.run laüft schon. Es funktioneirt auch beim GPIOActor: https://github.com/avollkopf/craftbeerp ... t__.py#L78

Ich schaue mir das an. Gib mir aber etwas zeit, da ich diese WOche in einer Schulung sitze.

Alex
Braumeister 20 | Gärung: SS Brewtech 7 Gal BME | Speidel 30 Liter (Konus)
https://github.com/PiBrewing
https://openbrewing.gitbook.io/craftbeerpi4_support/
mrhyde
Posting Senior
Posting Senior
Beiträge: 468
Registriert: Mittwoch 7. Juni 2017, 14:16

Re: cbpi4 Plugin: Schwimmerschalter

#12

Beitrag von mrhyde »

hiasl hat geschrieben: Dienstag 19. Juli 2022, 00:20 Es kommt mir fast so vor, als wenn die Funktion def run(self) gar nichts macht. Oder wie kann man das prüfen? Die Routine sollte doch eigentlich mit "while self.running is True" dauerhaft weiterlaufen, oder?

Edit: Ich habe das Schalten der Pumpe mal in den Sensor integriert. Da geht das einwandfrei! Ich würde jedoch lieber die Routine in einen Aktor packen, da der Sensor ja eigentlich der falsche Ort dafür ist. Außerdem kann man einen Aktor an und ausschalten und ist somit nicht vom Sensor dauerhaft abhängig.
Dein Problem liegt hier:

Code: Alles auswählen

    def on_start(self):
        self.state = False
        self.pump = self.props.get("Pump.........
Es muss aber eine asynchrone Funktion sein:

Code: Alles auswählen

    async def on_start(self):
        self.state = False
        self.pump = self.props.get("Pump.....
Dann läuft auch die asynchrone run funktion.

Alex
Braumeister 20 | Gärung: SS Brewtech 7 Gal BME | Speidel 30 Liter (Konus)
https://github.com/PiBrewing
https://openbrewing.gitbook.io/craftbeerpi4_support/
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#13

Beitrag von hiasl »

mrhyde hat geschrieben: Dienstag 19. Juli 2022, 19:41 Dann läuft auch die asynchrone run funktion.

Alex
Manchmal sieht man den Wald vor Bäumen nicht. :Ahh
Danke.

Eine Frage noch: Wie lautet denn der Befehl zum abfragen des Status eines anderen Actors?
Da hängts gerade noch.
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
Benutzeravatar
hiasl
Posting Freak
Posting Freak
Beiträge: 1948
Registriert: Samstag 9. Juni 2007, 12:03
Wohnort: Kulmbach
Kontaktdaten:

Re: cbpi4 Plugin: Schwimmerschalter

#14

Beitrag von hiasl »

Sorry, hatte das wohl schon korrekt, aber aufgrund eines falsch konfigurierten Sensors/Aktors nicht korrekt angezeigt bekommen.

Code: Alles auswählen

self.dashboardled = self.props.get("Dashboard-LED", None)
(...)
self.actor_led = self.cbpi.actor.find_by_id(self.dashboardled)
actor_led_state = self.actor_led.instance.state
Gruß
Matthias
-----------------------------------------------------------------------------------------
Mehr vom Bier wissen, heißt: Mehr vom Bier haben!
Antworten