FHEM Forum

FHEM => Automatisierung => Thema gestartet von: GG33 am 23 September 2014, 10:59:18

Titel: Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 23 September 2014, 10:59:18
Hallo, ich habe noch ein Problem in meinem Notify zur PV Eigenverbrauchsoptimierung.
Es funktioniert schon teilweise, aber wenn innerhalb der Zeit 12.00 bis 18.00 der Wert currentPower unter 3000 sinkt werden die Werte nicht zurückgesetzt. Wenn aber die Zeit nach 18.00 ist, werden die Werte wie gewollt zurückgesetzt. Was stimmt da noch nicht?
Und kann man noch irgendwie einen Timer einbauen, dass die Werte frühestens nach einer Mindestlaufzeit (z.b. 20min) zurück gesetzt werden? Damit die WP nicht dauern ein und ausschaltet.

PVGG33:currentPower.* {
   if ($hour >= 12 && $hour < 18) {
     if (ReadingsVal('PVGG33','currentPower',0) > 4500) {
       fhem('set Heizung hotWaterTemperatureTarget 50') unless ($value{Heizung} eq 'hotWaterTemperatureTarget 50');;
       fhem('set Heizung opModeHotWater Party') unless ($value{Heizung} eq 'opModeHotWater Party');;
     }
   } else {
     if (ReadingsVal('PVGG33','currentPower',0) < 3000) {
       fhem('set Heizung hotWaterTemperatureTarget 48') unless ($value{Heizung} eq 'hotWaterTemperatureTarget 48');;
       fhem('set Heizung opModeHotWater Auto') unless ($value{Heizung} eq 'opModeHotWater Auto');;
     }
   }
}
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Puschel74 am 23 September 2014, 16:42:22
Hallo,

ZitatWas stimmt da noch nicht?
Naja, Perl arbeitet wie jeder Interpreter auch.
Von oben nach unten und von links nach rechts.

In der Zeit zwischen 12 Uhr und 18 Uhr prüfst du nur ob der Wert größer 4500 ist.
Wenn nicht wird nichts passieren - da für einen Wert < 4500 kein else-teil existiert.
Wie sollen den da die Werte zurück gesetzt werden?

Wenn grundsätzlich bei < 3000 die Werte zurück gesetzt werden sollen würde ich erst auf den Wert und DANN auf die Uhrzeit prüfen.

Auch würde ich auf $value verzichten und dafür Value nehmen.
fhem("set Heizung hotWaterTemperatureTarget 50") if (Value(Heizung) ne "hotWaterTemperatureTarget 50")

Das mit dem at im Code ist dann das kleiner Problem:
fhem("define Werte_at at +00:20:00 set Heizung hotWaterTemperatureTarget 48") if (Value(Heizung) ne "hotWaterTemperatureTarget 48");

Achtung! Meine Codebeispiele sind NICHT für die fhem.cfg gedacht da ich diese niemals direkt bearbeite.
Bis in einer Stunde kann ich dann versuchen deinen Code komplett umzubauen so wie ich das gemeint habe.

Grüße

Edith: Wie angedroht  ;D

PVGG33:currentPower.* {
  if (ReadingsVal("PVGG33","currentPower",0) > 4500) {
    if ($hour >= 12 && $hour < 18) {
      fhem("set Heizung hotWaterTemperatureTarget 50") if (Value(Heizung) ne "hotWaterTemperatureTarget 50");
      fhem("set Heizung opModeHotWater Party") if (Value(Heizung) ne "opModeHotWater Party");
    }
  } elsif (ReadingsVal("PVGG33","currentPower",0) < 3000) {
    if (Value("at_hotWaterTemp") eq "") {
      fhem("define at_hotWaterTemp at +00:20:00 set Heizung hotWaterTemperatureTarget 48") if (Value(Heizung) ne "hotWaterTemperatureTarget 48");
      fhem("define at_opModeHotWater at +00:20:00 set Heizung opModeHotWater Auto") if (Value(Heizung) ne "opModeHotWater Auto");
    }
  }
}

Nochmal: Mein Code ist NICHT für die fhem.cfg - es sei den du willst Fehlermeldungen aufschlagen sehen.
Das if (Value("at_hotWaterTemp") eq "") { habe ich eingefügt damit sich im Logfile, je nachdem wie oft das notify getriggert wird, keine already defined, please delete Meldungen auftauchen.
Fehlermeldungen aus dem Logfile bitte hier posten.
Keine Garantie auf Funktion oder Korrektheit und geht auch sicher einfacher - aber ich schiess gerne über die linke Schulter ins rechte Auge  8)

Edith:
Wobei ich aber vermute das
ZitathotWaterTemperatureTarget
und
ZitatopModeHotWater
Readings sind ??
Dann müsstest du mit ReadingsVal arbeiten anstelle von Value if (ReadingsVal("Heizung","hotWaterTemperatureTarget",99)  != 50)
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 23 September 2014, 20:16:00
oder etwas kürzer mit:

define di_hotWater DOIF ([12:00-18:00] and [PVGG33:currentPower] > 4500)
   (set Heizung hotWaterTemperatureTarget 50,set Heizung opModeHotWater Party)
DOELSEIF ([PVGG33:currentPower] < 3000)
  (set Heizung hotWaterTemperatureTarget 48,set Heizung opModeHotWater Auto)

attr di_hotWater wait 0:1200


mit Verzögerung und ohne wiederholendes Schalten  ;)

Gruß

Damian

Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 25 September 2014, 08:31:55
Vielen Dank für die schnellen Antworten! Ich habe es nun mal mit dem DOIF probiert, mal schauen wie das heute funktioniert.
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 29 September 2014, 09:42:49
Das funktioniert schon mal ganz gut.
Aber das attr "wait 0:1200" verzögert den DOELSIF Befehl bei erreichen des Schwellenwertes.
Ich möchte die Verzögerung aber nur als "Mindestlaufzeit".
Kann man nicht im DIOF einen Timer starten und im DOELSEIF prüfen, ob dieser schon abgelaufen ist (als zusätzliche Bedingung)?

Viele Grüsse
Björn
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 29 September 2014, 14:35:44
Zitat von: GG33 am 29 September 2014, 09:42:49
Das funktioniert schon mal ganz gut.
Aber das attr "wait 0:1200" verzögert den DOELSIF Befehl bei erreichen des Schwellenwertes.
Ich möchte die Verzögerung aber nur als "Mindestlaufzeit".
Kann man nicht im DIOF einen Timer starten und im DOELSEIF prüfen, ob dieser schon abgelaufen ist (als zusätzliche Bedingung)?

Viele Grüsse
Björn

Mindestlaufzeit wovon?

Gruß

Damian
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 29 September 2014, 14:53:42
Zitat von: Damian am 29 September 2014, 14:35:44
Mindestlaufzeit wovon?

Gruß

Damian

vom ersten Zustand DOIF.
Der soll wenn gesetzt, min. z.b. 20 min bleiben. wenn aber der Zustand 1 schon 50 Minuten bestehend war und dann die Leistung unter 3000 fällt soll umgehend zu Zustand 2 gewechselt werden, ohne Verzögerung.
Da das ganze meine Wärmepumpe steuert, will ich damit nur erreichen, dass diese eine Mindestlaufzeit hat.
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 29 September 2014, 16:33:19
Zitat von: GG33 am 29 September 2014, 14:53:42
vom ersten Zustand DOIF.
Der soll wenn gesetzt, min. z.b. 20 min bleiben. wenn aber der Zustand 1 schon 50 Minuten bestehend war und dann die Leistung unter 3000 fällt soll umgehend zu Zustand 2 gewechselt werden, ohne Verzögerung.
Da das ganze meine Wärmepumpe steuert, will ich damit nur erreichen, dass diese eine Mindestlaufzeit hat.

Die wait-Zeiten sind unabhängig von einander. Es wird lediglich der laufende wait-Timer zurück gesetzt, wenn vor dem Ablauf die andere Bedingung erfüllt ist.
Wenn du komplexere Abhängigkeiten realisieren willst, dann wirst du das selbst programmieren müssen. Der Zugriff auf die Wait-Timer ist für Anwender nicht vorgesehen.

Ich werde zukünftig in DOIF einen nextwait-Timer einbauen, der wird ein Wiederholendes Schalten verzögern, aber das wird dir wahrscheinlich in diesem Fall auch nicht weiter helfen.

Womöglich fährst du besser mit wait 600:600 und/oder definierst dir einen dritten Zustand.

Gruß

Damian
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 02 Oktober 2014, 19:18:12
Ich habe jetzt mit einem dritten Zustand probiert, aber es bleibt im cmd_2 hängen.

define di_hotWater DOIF ([12:00-18:00] and [PVGG33:currentPower] > 4500)\
(set Heizung hotWaterTemperatureTarget 51,set Heizung opModeHotWater Party)\
DOELSEIF ([PVGG33:currentPower] < 4000)\
  (set Heizung hotWaterTemperatureTarget 47)\
DOELSEIF ([PVGG33:currentPower] < 3500)\
  (set Heizung hotWaterTemperatureTarget 47,set Heizung opModeHotWater Auto)

attr di_hotWater wait 0:0:1200


Ich habe dies gelesen, aber ich verstehe es nicht..?!
ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern).
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 02 Oktober 2014, 19:26:40
Zitat von: GG33 am 02 Oktober 2014, 19:18:12
Ich habe jetzt mit einem dritten Zustand probiert, aber es bleibt im cmd_2 hängen.

define di_hotWater DOIF ([12:00-18:00] and [PVGG33:currentPower] > 4500)\
(set Heizung hotWaterTemperatureTarget 51,set Heizung opModeHotWater Party)\
DOELSEIF ([PVGG33:currentPower] < 4000)\
  (set Heizung hotWaterTemperatureTarget 47)\
DOELSEIF ([PVGG33:currentPower] < 3500)\
  (set Heizung hotWaterTemperatureTarget 47,set Heizung opModeHotWater Auto)

attr di_hotWater wait 0:0:1200


Ich habe dies gelesen, aber ich verstehe es nicht..?!

cmd2 ist klar.

Von links nach rechts, heißt bei dir eher von oben nach unten.
Eine Zahl die kleiner als 3500 ist, ist gleichzeitig kleiner als 4000. Das sollte auch für einen Nicht-Programmierer logisch sein.

Daher wird bei dir nie der letzte Zustand erreicht, weil zuvor die zweite Bedingung zuschlägt.

Also wenn schon, dann die letzten beiden Bedingung mit ihren Kommandos tauschen.

Gruß

Damian
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Puschel74 am 02 Oktober 2014, 19:58:04
Um es kurz zu sagen:
Tausch mal die 4000 und die 3500 untereinander aus (und den set-teil mit anpassen  ;) )

Grüße
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 02 Oktober 2014, 21:48:07
Jetzt habe ich es verstanden! Danke!
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 04 Oktober 2014, 09:26:01
DOELSEIF ([PVGG33:currentPower] < 3500)\
  (set Heizung hotWaterTemperatureTarget 47,set Heizung opModeHotWater Auto)

attr di_hotWater wait 0:0:1200


Oder ist es möglich "set Heizung hotWaterTemperatureTarget 47" sofort auszuführen und nur "set Heizung opModeHotWater Auto" mit einer Verzögerung?
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 04 Oktober 2014, 09:30:46
Zitat von: GG33 am 04 Oktober 2014, 09:26:01
DOELSEIF ([PVGG33:currentPower] < 3500)\
  (set Heizung hotWaterTemperatureTarget 47,set Heizung opModeHotWater Auto)

attr di_hotWater wait 0:0:1200


Oder ist es möglich "set Heizung hotWaterTemperatureTarget 47" sofort auszuführen und nur "set Heizung opModeHotWater Auto" mit einer Verzögerung?

DOELSEIF ([PVGG33:currentPower] < 3500)\
  (set Heizung hotWaterTemperatureTarget 47,define auto at +00:05 set Heizung opModeHotWater Auto)



Gruß

Damian
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 04 Oktober 2014, 13:02:45
Super! vielen Dank!
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: GG33 am 29 Januar 2015, 21:16:48
Ich muss leider feststellen, dass ich in der ganzen programmiererei immer noch nicht recht durchblicke....

Ich habe versucht eine dritte Bedingung hinzuzufügen. Was stimmt nicht? Ich möchte verhindern, dass die WP Warmwassermacht, wenn sie eigentlich aus ist.
Neu ist nur: and [Heizung:opModeHotWater] != "Holiday" or "Off" der Rest funktioniert!

([12:00-18:00] and [PVGG33:currentPower] > 4500 and [Heizung:opModeHotWater] != "Holiday" or "Off")
(set Heizung hotWaterTemperatureTarget 51,set Heizung opModeHotWater Party)
DOELSEIF ([PVGG33:currentPower] < 4000)
  (set Heizung hotWaterTemperatureTarget 47,define auto at +00:20 set Heizung opModeHotWater Auto)
Titel: Antw:Fehler in Notify? und Timer einbauen?
Beitrag von: Damian am 29 Januar 2015, 21:36:47
Zitat von: GG33 am 29 Januar 2015, 21:16:48
Ich muss leider feststellen, dass ich in der ganzen programmiererei immer noch nicht recht durchblicke....

Ich habe versucht eine dritte Bedingung hinzuzufügen. Was stimmt nicht? Ich möchte verhindern, dass die WP Warmwassermacht, wenn sie eigentlich aus ist.
Neu ist nur: and [Heizung:opModeHotWater] != "Holiday" or "Off" der Rest funktioniert!

([12:00-18:00] and [PVGG33:currentPower] > 4500 and [Heizung:opModeHotWater] != "Holiday" or "Off")
(set Heizung hotWaterTemperatureTarget 51,set Heizung opModeHotWater Party)
DOELSEIF ([PVGG33:currentPower] < 4000)
  (set Heizung hotWaterTemperatureTarget 47,define auto at +00:20 set Heizung opModeHotWater Auto)


So funktioniert das leider (auch in höheren Sprachen) nicht.

statt: .... and [Heizung:opModeHotWater] != "Holiday" or "Off"...
eher: .... and ([Heizung:opModeHotWater] ne "Holiday" or [Heizung:opModeHotWater] ne "Off")...

wenn du es so meintest.

Gruß

Damian