Fehler in Notify? und Timer einbauen?

Begonnen von GG33, 23 September 2014, 10:59:18

Vorheriges Thema - Nächstes Thema

GG33

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');;
     }
   }
}
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

Puschel74

#1
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)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

#2
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

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

GG33

Vielen Dank für die schnellen Antworten! Ich habe es nun mal mit dem DOIF probiert, mal schauen wie das heute funktioniert.
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

GG33

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
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GG33

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.
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GG33

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).
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

Damian

#9
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Puschel74

#10
Um es kurz zu sagen:
Tausch mal die 4000 und die 3500 untereinander aus (und den set-teil mit anpassen  ;) )

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

GG33

FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

GG33

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?
FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GG33

FHEM 5.6 auf Raspi (Debian Wheezy)

Homematic HMLAN
4 x HM-ES-PMSw1-Pl / HM-WDS40-TH-I-2 / HM-SEC-SCo
LUXTRONIK2 / SolarView