Hallo Gemeinde ich brauche einen tip von euch wie ich mein script was mir den Pumpendruck wiedergiebt alle 2 minuten wen die PoolPumpe läuft ausführen lasse und wen kein druck darist die pumpe ausschaltet.
hatte irgendwie gedacht das fhem das skipt ja so auslöst
{system("/home/pi/druck.py");;}
ich habe folgende automatik für die pumpe eingebaut:
define PumpeAutomatik at +*04:00 { fhem("set Poolpumpe on-for-timer 3600") and ("set SolarPumpe off") if($hour>=8 && $hour<21)}
attr PumpeAutomatik group Schaltung
attr PumpeAutomatik icon icoUhr
attr PumpeAutomatik room Pool,ZZ_Steuerungen
script druck.py
import fhem
# Connect via default protocol telnet, default port 7072:
fh = fhem.Fhem("myserver.home.org")
import time
import Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115(address=0x48, busnum=1)
# Gain = 2/3 for reading voltages from 0 to 6.144V.
# See table 3 in ADS1115 datasheet
GAIN = 2/3
value = [0]
# Read ADC channel 0
value[0] = adc.read_adc(0, gain=GAIN)
# Ratio of 15 bit value to max volts determines volts
volts = value[0] / 32767.0 * 6.144
# Tests shows linear relationship between psi & voltage:
psi = 13.33 * (volts -0.5)
# Bar conversion
bar = psi * 0.0689475729
#print("{0:0.3f}V [{1}]".format(volts, value[0]))
print("\n{0:0.0f} psi {1:0.1f} bar".format(psi, bar))
# Send a command to FHEM (this automatically connects() in case of telnet)
#fh.send_cmd("set PumpeDruck :{bar}")
fh.send_cmd("set PumpeDruck "+str(bar))
Vorab: Das ist kein codeschnipsel!
Siehe angepinnter Treadtitel in diesem Bereich:
ZitatBoard ist nur für funktionsfähige Codeschnipsel! Keine Fragethemen starten!
Zum eigentlichen: warum startest Du das script nicht auf OS-Ebene mit einem cron-Job alle 2 Min, dann hast Du Events in FHEM, auf die Du reagieren kannst? (Geht aber auch über FHEM mit einem at ähnlich dem, das Du hier gepostet hast).
Und wenn Du eigentlich nur einmalig einschalten willst, dann aber wieder ausschalten, wenn entweder die Zeit abgelaufen ist oder ein Ereignis eintritt (zu niedriger Pumpendruck wird gemeldet), ist eine zeitliche Einschränkung des "Dauer-at's" mit disabledForIntervals oder gleich ein einmaliges Einschalten um 8 Uhr bis 21 Uhr (on-till) m.E. besser geeignet als Dein if-Konstrukt, bei dem diese "and"-Anweisung auch in der Form nicht funktionieren dürfte (schau mal in die commandref zu "Befehlstypen").
Grundsätzlich ist es m.E. besser, die wechselseitigen Abhängigkeiten im Ablauf sauber aufeinander abzustimmen. Das hier sieht im Moment noch so aus, als würdest Du im Ergebnis dauernd ein- und wieder ausschalten, wenn der Druck zu niedrig ist (alle 4 Min ein (Druck wird ja nicht geprüft), dann spätestens nach 2 Min wieder aus, wenn dann die Druck-Info kommt).
Ohne das im Detail nochmal geprüft zu haben, würde ich versuchen, gar kein at zu nehmen, sondern den Pumpendruck per cronjob immer zu senden und darauf dann ein (ggf. mit disableForIntervals eingeschränktes) notify zu legen, das die Pumpe ein- und ausschaltet, wenn nicht der Zielzustand bereits erreicht ist (für's Einschalten könntest Du dann auch zusätzlich die Zeit prüfen); andere würden dafür vermutlich ein DOIF nehmen.
Gruß, Beta-User
Hoffe bin dan hier im richtigen bereich.
diese at habe ich im wiki gefunden und um den bereich des ausschalten der SolarPumpe erweitert.
define PumpeAutomatik at +*04:00 { fhem("set Poolpumpe on-for-timer 3600") and ("set SolarPumpe off") if($hour>=8 && $hour<21)}
zu meinem verständniss würdest du ein notify benutzen was in der zeit von 8-21 uhr die Poolpumpe für 3600 anschaltet und die SolarPumpe aus. es geht mir beim druck darum das wen die Poolpumpe nicht läuft auch kein druck da ist deswegen dachte ich einfach nur alle 2 minuten messen wen auch druck da sein kann.
code geändert auf:
+*04:00 { fhem("set Poolpumpe on-for-timer 3600") and ("setstate SolarPumpe off") if($hour>=8 && $hour<21)}
danke für den hinweis
also irgendwie schmeisst du da alles durcheinander....
wie bist du denn jetzt auf "setstate" gekommen?
funktioniert dein code?
eigentlich sollten fehler im log auftauchen...
dein ausführungsteil:
fhem("set Poolpumpe on-for-timer 3600") and ("set SolarPumpe off") if($hour>=8 && $hour<21)
kann so mMn nicht funktionieren.
du willst zwei sachen schalten, aber das geht nicht mit "and" !! (hat Beta-User auch schon geschrieben....)
und du möchtest, wie auch immer den druck berücksichtigen, aber in deinem bisher geposteten code taucht dazu nirgends was auf. außer das setzen über dein script (ob es funktioniert kann ich nicht beurteilen!)
Forumsbereich ist jetzt besser, aber irgendwie habe ich den Eindruck, dass wir Grundlagen diskutieren, das wären also eigentlich "Anfängerfragen".
Die Wechselbeziehung der beiden Pumpen habe ich wohl noch nicht verstanden, es dürfte unabhängig von der konkreten Umsetzung also sinnvoll sein, erstmal den Ablauf zu beschreiben:
1. Die Poolpumpe wird um 8 Uhr eingeschaltet (im Moment für 3600=1h).
a) Macht das mit dem wiederholten Einschalten alle 4 Min. Sinn oder sollte diese Pumpe nicht länger laufen? Indirekt sollte sie um ca. 22:00 Uhr spätestens ausgehen, aber was ist zwischendurch? Hier wäre es naheliegender, die richtigen Ereignisse rauszufinden, auf die reagiert werden soll.
b) Nur wenn die Poolpumpe läuft, willst Du den Druck messen, richtig? Dann würde ich mit einem notify auf Poolpumpe "on" ein temporäres at anlegen (defmod), das alle 2 Min. das script aufruft, und auf "off" dieses at wieder löschen (alternativ: aktivieren/deaktivieren, man kann das auch über 2 notify machen, ist von der Syntax her für Einsteiger leichter).
2. Wenn die Poolpumpe läuft, soll (solange?) die Solarpumpe aus sein. Wie wird Sie wieder eingeschaltet? Wenn wechselseitig automatisch und nur abhängig von der Poolpumpe: Ginge mit dem/einem weiteren notify auf die Poolpumpe.
Neulich gab es hier übrigens auch einen Thread, der sich mit was ähnlichem befaßt hat.
Das Einsteiger-pdf hast Du Dir schon in Ruhe zu Gemüte geführt?
Gruß, Beta-User
Der Teil der PoolPumpen Automatik soll alle 4 stunden in der zeit von 8-21 uhr die Poolpumpe für 1std anschalten und die Soolar aus(beide gleiche saugleitung) +*04:00 { fhem("set Poolpumpe on-for-timer 3600") and ("setstate SolarPumpe off") if($hour>=8 && $hour<21)}
für die Soolarpumpe giebt es ein DOIF was die Solaranlage steuert. habe jetzt mein script zur drucksetzung in cron eingebunden. den ich denke es ist dan einfacher in fhem.
Bei der Konstruktion sehe ich die Gefahr, dass sich das DOIF für die Solarpumpe und dieses at in die Quere kommen.
Mal angenommen, dem ist nicht so: Wenn Du disabledForIntervals nicht magst, nimm meinetwegen statt des at einen weekdaytimer, der um 8:00 Uhr, 12:00 Uhr, 16:00 Uhr und 20:00 Uhr im Ausführungsteil diese beiden Befehle absetzt:
set Poolpumpe on-for-timer 3600;;set SolarPumpe off-for-timer 3600
Wie auch Niels_ schon geschrieben hat: Der Code in der von Dir gedachten Form kann so nicht funktionieren, weil das mit dem "and" keine gültige Anweisung oder Logik ist.
Bitte mal in der commandref an der angegebenen Stelle nachschlagen!
Gruß, Beta-User
also dann so?
define PumpeAutomatik2 at *08:00:00 { fhem("define PumpeAuto at +*{4}04:00:00 set Poolpumpe on-for-timer 3600;;set SolarPumpe off-for-timer 3600") }
attr PumpeAutomatik2 group Schaltung
attr PumpeAutomatik2 icon icoUhr
attr PumpeAutomatik2 room Pool,ZZ_Steuerungen
ich habe jetz erst mal die berücksichtigung des PumpeDruck rausgelassen.
Das sollte auch ok sein, allerdings dürfte dann das PumpeAutomatik2-at sinnvollerweise um 4 Uhr auszuführen sein, damit um 8 Uhr wirklich dann das erste mal an/aus-geschaltet wird, oder? Sowas ist mit dem Modul weekdaytimer einfacher, da kann man die Schaltzeiten direkt eintragen.
Weitere Anmerkungen noch:
- der Ausflug nach perl ist evtl. nicht erforderlich (es sei denn, Du willst nach perl wg. der späteren if-Abfrage des Drucks)
- defmod statt define für das PumpeAuto-at (verhindert in gewissen Konstellationen eine Error-Meldung)
- an's Ende des PumpeAuto-at-defmod würde ich noch ein "-temporary" anfügen, dann wird das nicht versehentlich in der gespeichert bzw. es sollte auch kein "rotes ?" kommen.
also würde das so besser sein. ohne Perl?
define PumpeAutomatik2 at *04:00:00 ("defmod PumpeAuto at +*{4}04:00:00 set Poolpumpe on-for-timer 3600") -temporary
attr PumpeAutomatik2 group Schaltung
attr PumpeAutomatik2 icon icoUhr
attr PumpeAutomatik2 room Pool,ZZ_Steuerungen
würde der Weekdaytimer so aussehen?
define PoolAutom.WT WeekdayTimer PoolPumpe Mo-So|{("08:00","12:00","16:00","20:00")}|on-for-timer 3600
attr PoolAutom.WT commandTemplate set $NAME $EVENT
define PumpeAutomatik2 at *04:00:00 defmod PumpeAuto at +*{4}04:00:00 set Poolpumpe on-for-timer 3600;;set SolarPumpe off-for-timer 3600 -temporary
attr...
Weekdaytimer sollte eher so aussehen (müßte auch ohne perl gehen):
define PoolAutom.WT WeekdayTimer PoolPumpe 08:00|on 12:00|on 16:00|on 20:00|on set Poolpumpe on-for-timer 3600;;set SolarPumpe off-for-timer 3600
(ohne Attribut)
Kann aber grade nicht testen...
ich aber beide versionen klappen 1A jetzt ist nur die frage ob ich den weektimer besser nutze in verbindung mit dem druck oder ob ich lieber ein seperaten dummy oder notify anlege um den druck zu überfrüfen wen die poolpumpe on ist denke seperat würde sinniger sein weil dann ja auch mitberücksichtigt würde wen durch meinen schalter die Pumpe angeschaltet wird.
Im Ergebnis würde ich das vermutlich so lösen:
- ein notify, das die Solarpumpe aus- bzw. einschaltet, wenn die Poolpumpe ein- bzw. ausgeschaltet wird. Problem ist dabei aber immer, dass dann beide Pumpen kurz miteinander denselben Zustand haben (ist aber nach den bisherigen Lösungen auch so)
- den WeekDaytimer zum Einschalten der Poolpumpe, der dann gleichzeitig ein temporary-notify mit defmod anlegt, das wieder ausschaltet, wenn der Druck zu niedrig bleiben bzw. werden sollte; ggf. muß da ein sleep x dazwischen, damit die Pumpe die Chance hat den Druck erst aufzubauen bzw. der erste Wert nach Einschalten verarbeitet wird. Einen Dummy würde ich nicht dazwischenschalten, lieber eine if-Abfrage wegen der erforderlichen Größe...
Die notwendigen Bauteile solltest Du jetzt ja haben ;) .
Dann werde ich mich mal morgen erst mit der Glättung des zappelnden Druckwertes beschäftigen denke nen Elko zwischen 10nF bis 10my F mal testen und danach mal langsam in ordentliche umstrucktorierung umbauen. Theoretisch sollte auch ein aussetzen meiner DOIF Bedingung für die solarpumpe reichen. Erst mal Danke für die geduldige Hilfe und die tips.