Seite 1 von 1
cbpi4 Plugin: Schwimmerschalter
Verfasst: Freitag 15. Juli 2022, 10:56
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.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Freitag 15. Juli 2022, 15:35
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?
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Freitag 15. Juli 2022, 16:24
von JackFrost
Hi,
was tut der Code schon und was geht noch nicht ?
Gruß JackFrost
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Freitag 15. Juli 2022, 17:29
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.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Freitag 15. Juli 2022, 18:52
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 ?
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
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Samstag 16. Juli 2022, 00:51
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?
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Samstag 16. Juli 2022, 07:34
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.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Samstag 16. Juli 2022, 13:39
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?
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Sonntag 17. Juli 2022, 21:06
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.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Dienstag 19. Juli 2022, 00:20
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.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Dienstag 19. Juli 2022, 19:10
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
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Dienstag 19. Juli 2022, 19:41
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
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Mittwoch 20. Juli 2022, 11:44
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.
Danke.
Eine Frage noch: Wie lautet denn der Befehl zum abfragen des Status eines anderen Actors?
Da hängts gerade noch.
Re: cbpi4 Plugin: Schwimmerschalter
Verfasst: Mittwoch 20. Juli 2022, 11:59
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