2 Temperaturen subtrahieren, ich schaffs nicht....

Begonnen von Stromschiene, 24 Mai 2015, 15:31:06

Vorheriges Thema - Nächstes Thema

flurin

Zitat von: Stromschiene am 03 Juni 2015, 16:59:29
Nur leider wird das DOIF mehrmals, alle 10/1 Minute ausgeführt. Ich möchte aber die Rollläden wg. der Luftzirkulation nicht ganz schließen. Werden sie mehrmals geschlossen, so sind sie später ganz zu und der Luftpolster zwischen Scheibe und Rollladen heizt sich unnötig auf.

T_diff so ergänzen:


attr T_diff event-on-change-reading state


Damit wird nur bei einer Temperaturänderung getriggert.

Stromschiene

Danke, kann es aber frühestens am Montag ausprobieren.
mfg
Stefan

Stromschiene

Leider, nein.
Egal wie/wo ich "attr T_diff event-on-change-reading state" einfüge, geschieht nichts, oder immer.

1. Es sollte ja nur einmal das DOIF > 20 ausgeführt werden. (wird ja erkannt)
2. Dann warten und nix tun.
3. Bis < 19 ausgeführt wird. (wird auch erkannt)
4. Und wieder warten bis Punkt 1. erfüllt wird.

Grundbedingung: Diese Werten müssen eine gewisse Mindestzeit konstant anliegen. (wait: funktioniert)

Gibt es noch andere einfache Möglichkeiten?

mfg

flurin

Zitat von: Stromschiene am 08 Juni 2015, 10:53:42
Leider, nein.
Egal wie/wo ich "attr T_diff event-on-change-reading state" einfüge, geschieht nichts, oder immer.

Ich habe kurz sinngemäss diese Lösung erfolgreich getestet:


define di_temp_diff DOIF
attr di_temp_diff state {([local_weather:temperature:d]-[temp_living:temperature:d])}


ohne "attr di_temp_diff event-on-change-reading state"


define di_diff DOIF ([di_temp_diff] > 5) ({Log(3, "set R_alle AB")})
DOELSEIF ([di_temp_diff] < 4) ({Log(3,"set R_alle AUF")})
attr di_diff wait 5:5


ohne "attr di_diff do always"

Bemerkung: je nach di_temp_diff kann zuerst DOELSEIF ausgeführt werden und dann DOIF.


Stromschiene

Leider nein.

Ich habe Deinen Code umkopiert und angepasst.

define T_diff DOIF
attr T_diff group temp
attr T_diff state {([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}

define T_diff_EG DOIF ([T_diff] > 9) ({Log(3, "set Kueche AB")}) DOELSEIF ([T_diff] < 5.8) ({Log(3,"set Kueche AUF")})
attr T_diff_EG wait 60:60

(Kueche ist derzeit mein Probefenster)
Einfach keine Reaktion, keine Fehlermeldung.
T_diff arbeitet korrekt.

lt. Referenz sollte doch DOIF schon von Haus aus die Auslösereihenfolge beachten.
Vielleicht höhrt DOIF auf das falsche Ereignis?? (oder kein Ereignis??)
Oder liefert der Zahlensprung in T_diff keine Triggersignal?
Ich kenne mich da leider nicht aus.

.. und warum bei Dir und nicht bei mir??

-> Ratlos

mfg



flurin

#20
Hallo Stromschiene

Könntest du folgende Lists posten:


list T_diff



list T_diff_EG


PS: am besten Code einfügen verwenden.

Stromschiene

Bitteschön:
Internals:
   NAME       T_diff
   NR         93
   NTFY_ORDER 50-T_diff
   STATE      12.563
   TYPE       DOIF
   Readings:
     2015-06-08 14:14:49   state           12.563
   Devices:
   Helper:
     last_timer 0
     sleeptimer -1
   Itimer:
   State:
     device      T_Sonne T_Schatten
Attributes:
   group      temp
   state      {([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}


Internals:
   DEF        ([T_diff] > 9) ({Log(3, "set Kueche AB")}) DOELSEIF ([T_diff] < 5.8) ({Log(3,"set Kueche AUF")})
   NAME       T_diff_EG
   NR         109
   NTFY_ORDER 50-T_diff_EG
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-06-08 11:03:39   cmd_event       T_diff
     2015-06-08 11:03:39   cmd_nr          1
     2015-06-08 14:16:48   e_T_diff_STATE  12.812
     2015-06-08 11:03:39   state           cmd_1
     2015-06-08 13:02:13   wait_timer      no timer
   Condition:
     0          InternalDoIf('T_diff','STATE','') > 9
     1          InternalDoIf('T_diff','STATE','') < 5.8
   Devices:
     0           T_diff
     1           T_diff
     all         T_diff
   Do:
     0          {Log(3, "set Kueche AB")}
     1          {Log(3,"set Kueche AUF")}
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           T_diff:STATE
     1           T_diff:STATE
     all         T_diff:STATE
   Itimer:
   Readings:
   State:
   Trigger:
Attributes:
   wait       60:60


mfg

flurin

#22
Abgesehen von den zusätzlichen Klammern (kann man weglassen):

{([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}

fällt mir nichts auf.

cmd_1 wurde ausgeführt, demzufolge müsste in fhem-2015-06.log ein Eintrag vorhanden sein.

Evtl. Version prüfen:


version DOIF



# $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $


zusätzlich "shutdown restart" ausführen.

Edit:
cmd_1 oder cmd_2 werden nur ausgeführt, wenn die Bedingung sich ändert.
Ändert sich T_diff aber bleibt die Bedingung beispielsweise > 9, dann passiert nichts.
Zum Testen, kannst du das DOIF initialisieren (DEF und modify T_diff_EG klicken)

Stromschiene

Version ist gleich.
Im Log ist ein set Kueche ab eingetragen. Wurde aber nicht ausgeführt.

Werde das morgen weiter verfolgen.

THX
mfg

Stromschiene

Da scheint etwas mit dem "set" Befehl nicht zu stimmen.
"set Kueche AB" steht richtig im Log, wird aber ignoriert. Und steht auch nur ein mal dort.
"set Kueche AB", in der Commandline eingegeben, funktioniert.
mfg

flurin

#25
Zitat von: Stromschiene am 08 Juni 2015, 18:54:10
Da scheint etwas mit dem "set" Befehl nicht zu stimmen.
"set Kueche AB" steht richtig im Log, wird aber ignoriert. Und steht auch nur ein mal dort.
"set Kueche AB", in der Commandline eingegeben, funktioniert.
mfg

Bei meiner Testversion wird der Befehl nur protokolliert nicht ausgeführt.

define di_diff DOIF ([di_temp_diff] > 5) ({Log(3, "set R_alle AB")})
DOELSEIF ([di_temp_diff] < 4) ({Log(3,"set R_alle AUF")})
attr di_diff wait 5:5


Um es mit dem Gerät zu testen, muss es so definiert werden:


define di_diff DOIF ([di_temp_diff] > 5) (set R_alle AB)
DOELSEIF ([di_temp_diff] < 4) (set R_alle AUF)
attr di_diff wait 5:5



franky08

Ich verfolge den Thread jetz schon die ganze Zeit, wiso macht ihr euch das Leben so schwer? Pack den Kram in eine sub und schreib das Ergebnis in ein dummy oder wo auch immer zurück und fertig. Da brauch ich kein DOIF oder DOELSEIF oder was auch immer. Values über ReadingsVal auslesen, einer Variablen zuweisen, berexhnen und zurückschreiben, sub über ein at triggern, hat den Vorteil das Berechnungsinterval selbst festlegen zu können.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

flurin

#27
Zitat von: franky08 am 09 Juni 2015, 00:23:01
Ich verfolge den Thread jetz schon die ganze Zeit, wiso macht ihr euch das Leben so schwer? Pack den Kram in eine sub und schreib das Ergebnis in ein dummy oder wo auch immer zurück und fertig. Da brauch ich kein DOIF oder DOELSEIF oder was auch immer. Values über ReadingsVal auslesen, einer Variablen zuweisen, berexhnen und zurückschreiben, sub über ein at triggern, hat den Vorteil das Berechnungsinterval selbst festlegen zu können.

VG
Frank

Das ist wohl nicht das Problem! Wozu eine Perl-Funktion, wenn ich es mit einem simplen DOIF lösen kann?


define di_temp_diff DOIF
attr di_temp_diff state {([local_weather:temperature:d]-[temp_living:temperature:d])}


Die Differenz wird bei jeder Temperaturänderung (egal welche Temperatur sich ändert) berechnet, da brauche ich kein "at" mit einem Berechnungsintervall, um eine Perl-Funktion auszuführen. Ein Dummy ist auch überflüssig.

Aber wie sieht deine konkrete Lösung mit einer Perl-Funktion aus? und wie löst du die ganze Aufgabe mit den Wartezeiten?

Gruss
flurin

Stromschiene

Flurin, Herzlichen Dank, jetzt läuft's:
Für unser Mitleser der funktionierende Code lautet jetzt:

define T_diff DOIF
attr T_diff state {([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}

define T_diff_OG DOIF ([T_diff] > 9) (set R_OG_Alle AB) DOELSEIF ([T_diff] < 4) (set R_OG_Alle AUF)
attr   T_diff_OG wait 600:1200


Damit ich auch weis wie's geht, was beutet:
"state {([T_Sonne:temperature:d"  genau?

... und wo kann man das nachlesen?

Eine Zusatzfrage hätte ich noch:

Ich möchte die DOIF Anweisung nur ausführen, wenn das Dummy "R_OG_Alle" (alle Rollläden im Obergeschoß)
auf "AUTOM"(Automatisch) stehen.


Bevor ich mich da lange ärgere, kannst Du mir bitte das auch noch zeigen?

Du bist Spitze. Ich weis zwar nicht wer Du bist, und wo Du wohnst,
aber wenn wir uns mal in diesem oder im nächsten Leben treffen,
möchte ich Dich auf ein Bier einladen. (:=))
Danke!

Servus, aus Wien

flurin

#29
Hallo Stromschiene

Wow! so viel Lob erhalte ich selten. Danke.
In Wien war ich auch schon, eine sehr schöne Stadt.

Zitat
Damit ich auch weis wie's geht, was beutet:
"state {([T_Sonne:temperature:d"  genau?

... und wo kann man das nachlesen?

Commandref:
DOIF > Anpassung des Status mit Hilfe des Attributes state
und
DOIF >Filtern nach Zahlen"

Zitat
Ich möchte die DOIF Anweisung nur ausführen, wenn das Dummy "R_OG_Alle" (alle Rollläden im Obergeschoß)
auf "AUTOM"(Automatisch) stehen.


define T_diff_OG DOIF ([T_diff] > 9 and [?R_OG_Alle] eq "AUTOM") (set R_OG_Alle AB)
DOELSEIF ([T_diff] < 4 and [?R_OG_Alle] eq "AUTOM") (set R_OG_Alle AUF)
attr   T_diff_OG wait 600:1200


Gruss
flurin