[gelöst] Beregnung/mehrere Kreise schaltbar/Sonnenstandabhängig/Pumpen gesteuert

Begonnen von holle75, 03 April 2017, 17:43:09

Vorheriges Thema - Nächstes Thema

holle75

#45
... und wie könnte ich das ohne Extra Dummy (BEREGNUNG_SCHALTER_00_Cisterna dummy) für den Schalter machen (die Pumpe muß anders heißen)? Die Pumpe müßte ich leider, resp optimalerweise, direkt schalten können ohne Dummy dazwischen. Oder ich mach eine STRUCTURE die dann den state von meiner Pumpe einnimmt.

holle75

... aber sonst natürlich völlig logisch auf einen laufenden Beregner abzufragen :D

wieso kommt mir sowas nicht? Hatte einen ähnlichen Ansatz am Anfang, .... verworfen weil ich irgendwie Angst hatte, dass dann die Pumpe wenn es von einem Beregner zum nächsten geht immer kurz (Millisekunden, aber Hardware würde bewegt) ausschaltet. Aber das ist ja mit dem wait abgefangen ..... das ich allerdings aus einem anderen Grund jetzt drin hatte ;)

Per

Ich (!) würde es hiermit machen ;).

Aber für deinen Zweck "oversized". Geht auch mit dem DOIF, hatte ich schonmal gemacht, aber verworfen, weil ich o.a. Modul eh im Einsatz habe. Mal sehen ob ich das wiederfinde.
Wird aber nix in den nächsten Stunden. Evtl. morgen.

holle75

ich probier mal weiter, aber/und warte sonst gern auf morgen. Will nicht noch eine syntax für ein Modul lernen. Du forderst mich hier schon genug ;)

holle75

.... habs jetzt mal mit einer structure gemacht. Die nennt sich

define BEREGNUNG_SCHALTER_00_PumpeCisternaStructure structure room BEREGNUNG_SCHALTER_DUMMY_PUMPE
attr BEREGNUNG_SCHALTER_00_PumpeCisternaStructure clientstate_behavior last


(BEREGNUNG_SCHALTER_DUMMY_PUMPE wird später der direkte Schalter der Pumpe)

nur jetzt denke ich einen Fehler in der Logik gefunden zu haben.

Wenn

define BeregnungDOIF_PumpeCisterna DOIF (([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0)
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \


die Pumpe angeschaltet hat, kann ja der DOELSEIF -Fall nicht eintreten, weil BEREGNUNG_SCHALTER_00_PumpeCisternaStructure (oder auch direkt ein dummy) Fall 1 nicht == 0 werden lassen wird.

holle75

#50
Hiermit gehts FAST und löst auch das Pumpen Dummy Problem

define BeregnungDOIF_PumpeCisterna DOIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 and [BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)

attr BeregnungDOIF_PumpeCisterna wait 0:[BeregnungDOIF_Mapping]+10


aber ...... [BeregnungDOIF_Mapping]+10 brauchts, weil er sonst im Auto-Durchlauf genau die Zeit vor dem letzten Beregner die Pumpe ausmacht.

Das wäre so gelöst, aber wenn man Einzelberegner anschaltet, geht das mit dem Ersten. Sobald man den zweiten dazuschaltet geht die Pumpe nach 10 sekunden aus. Da ich deine Syntax  [#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 nicht im Detail verstehe habe ich so weitergespielt:

define BeregnungDOIF_PumpeCisterna DOIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 and [BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSEIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] == 0) (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)


Das scheint zu funktionieren, aber so ganz verstehen, naja ......

und ich bekomme das im log

Argument "off" isn't numeric in numeric ne (!=)

holle75

Also, ich sitz jetzt seit  2 Stunden vor dieser Zeile:

define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)

attr BeregnungDOIF_PumpeCisterna wait 0:6*[BeregnungStandarddauer]+10


und egal was ich mit

[#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0

mache, es funktioniert einfach nicht.

Laut commandref, so habe ich es verstanden, sollte obige Zeile alle Devices die mit  BEREGNUNG_SCHALTER_0 anfangen durchzählen und mir einen Zahlenwert zurückgeben über die Anzahl dieser Devices mit state off.... und ich habe jetzt sicherlich 100 Varianten durch. Inkl ohne and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" und attr do always, Default-Wert, und, und, und.  Manchmal funktionierts , bei einer anderen Auto-Auswahl von Beregnern dann aber doch wieder nicht. Hab da noch keine Logik erkennen können.

Ein Wunder, dass der neue Raspi noch lebt im Moment.


Damian

Die Syntax ist korrekt.

Du kannst das mal testen mit:

define di_test DOIF(1)(set bla [#"^BEREGNUNG_SCHALTER_0":state:"off"])

mit set di_test cmd_1 wird set bla ausgeführt und liefert einen Fehler da bla normalerweise nicht da ist. In der Fehlermeldung ist aber das Ergebnis, hier die Anzahl der Devices sichtbar.

Mit [@"^BEREGNUNG_SCHALTER_0":state:"off"] kannst du dagegen dir die Devices selbst ausgeben lassen.

Voraussetzung ist natürlich die aktuelle Version von DOIF.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 or [?$SELF:manu] eq "on")
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on)
DOELSIF  ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" and [?$SELF:cmd] <> 4)
(set $SELF manu off)
DOELSIF  ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "on" and [?$SELF:cmd] <> 1)
(set $SELF manu on)
DOELSE
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna myReadings manu

berücksichtigt externes Schalten der Zisternenpumpe. Voraussetzung ist, dass [#"^BEREGNUNG_SCHALTER_0":state:"off"] geht.

! Habe gerade kein FHEM da, nur mit Notepad geschrieben !

holle75

#54
Hallo Damian. danke für die Bestätigung der Syntax. Hab deinen Code probiert und es wird die korrekte Anzahl angegeben. Da den Fehler ausgeschlossen zu haben stellt die Frage, wo es denn jetzt hängt.  Da die Ergebnisse so willkürlich waren, dachte ich das DOIF verhaspelt sich irgendwo.

Mit einer kleinen Verzögerung in MappingDOIF scheint es jetzt zu funktionieren. Ich bin noch skeptisch :D

define BeregnungDOIF_Mapping DOIF (["Beregner_:on"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 1;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:auto|off"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 1;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] == 2) \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|6*[BeregnungStandarddauer]|0|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
attr BeregnungDOIF_Mapping room Beregnung


Die Abfrage ob ein Beregner läuft scheint geklärt. Löst aber nicht die ursprüngliche Aufgabe.

Wenn ich ein

and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off"
in
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)


einbau, läuft die Pumpe genau bis zum zweiten Beregner, da dann [#"^BEREGNUNG_SCHALTER_0":state:"off"] wieder triggert und da BEREGNUNG_SCHALTER_DUMMY_PUMPE dann nicht mehr off ist, wird DOELSE ausgeführt und die Pumpe abgeschaltet. Pers (Edit: ALTE) Variante stellt da wohl das selbe Problem.

Jemand eine Idee?

Edit: Oh, der Per war schneller! Ich schau gleich drüber. Danke

Per

Zitat von: holle75 am 28 April 2017, 13:12:30Pers (Edit: ALTE) Variante stellt da wohl das selbe Problem.
Einspruch! Meine Alte (also Variante ;)) hat sich um den echten Status der Pumpe nicht gekümmert, nur um einen Dummy. Aber da waren mir die lokalen Gegebenheiten noch nicht bekannt.

holle75

Jo, deine Alte hatte auch nur in Bezug auf die eigentliche Aufgabe ein wenig hinterhergehinkt. Wollte ja nicht sagen, dass deine Alte ein generelles Problem gehabt hätte ! :D

ich bin noch an deiner Neuen .... muß aber erstmal was Essen nach all der Aufregung ;)

Per

Meine Alte ist schon ganz ok so, passt halt nur nicht zu dir  ;D ;D ;D

holle75

#58
Vielleicht die Neue ??!  8)

Also, <> schmeißt mir Fehler und myReadings mag DOIF scheinbar auch nicht.

Habs jetzt so probiert:

define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 or [?$SELF:manu] eq "on") \
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSEIF  ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF  ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "on" and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna readingList manu


dann wird zwar die Pumpe angeschaltet, aber nicht mehr am Ende ausgeschaltet.

Wenn die Pumpe an war, bleibt sie an. Das hätt ich aber auch alleine hinbekommen  ;D  ;D  ;D

und da ich es wie immer nicht verstehe, was du da gebastelt hast ..... Idee?


Edit: [#"^BEREGNUNG_SCHALTER_0":state:"on"] != 0 did the trick. Man beachte das on statt off. Bin ganz aufgeregt. Ich test mal weiter.

Per

Habe ich das mit dem "off" schon wieder gemacht?!  :-[ :-[ :-[

<> ist in den meisten anderen Programmiersprachen, != bei Perl. Auf dem Notepad gings aber :P

Und versuch es mit myreadings.