at mit in Subroutine berechneter Zeit füllen

Begonnen von MisterEltako, 04 März 2013, 18:16:03

Vorheriges Thema - Nächstes Thema

MisterEltako

Hi, Dietmar!

Habe deine Routine eingefügt, welche leider zu folgenden Logeinträgen führt:
2013.03.08 01:10:45 3: midnight------------>08 00:00:00 Argument "sunrise" isn't numeric in int at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 84. Use of uninitialized value $Array_wetter[1] in int at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 84. Use of uninitialized value $Array_wetter[2] in int at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 84.
2013.03.08 01:10:45 3: Zeit------------>08 00:00:00
2013.03.08 01:10:45 3: Summand----------->00:00
2013.03.08 01:10:45 3: newTime------------>08 00:00:00
2013.03.08 01:10:45 3: Zeitstring neu------------>08 00:00:00
2013.03.08 01:10:45 3: Offset-Routine_new liefert: sunrise ist 08 00:00:00
2013.03.08 01:10:45 1: define: the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 00:00:00. 2013.03.08 01:10:45 3: define Sonnenaufgang_new at {Offset_new('sunrise','00:00:00','07:00:00','09:00:00')} set Rollladen_EG 100 : the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 00:00:00. 2013.03.08 01:10:45 3: Rollladen_Yahoo_gesteuert_auf_new return value: the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 00:00:00. 2013.03.08 07:00:14 2: CUL_HM set Rollladen_EG 100 rxt:1 2013.03.08 07:00:14 1: 192.168.100.33:1000 disconnected, waiting to reappear 2013.03.08 07:02:59 1: 192.168.100.33:1000 reappeared (HMLAN)

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

Poste bitte den genauen Code, dann kann ich prüfen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

MisterEltako

Habe exakt deinen o.g Code übernommen....
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

# my $Zeitstring = ReadingsVal("Local_Wetter","$Methode","nv");
  my $Zeitstring = $Methode;

Entferne bitte mal das # vor dieser Zeile!
Dann sollte es schon besser aussehen

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

MisterEltako

Dann kommt....

2013.03.08 18:14:00 3: midnight------------>08 00:00:00
2013.03.08 18:14:00 3: 06, 37, 00
2013.03.08 18:14:00 3: Zeit------------>08 06:37:00
2013.03.08 18:14:00 3: Summand----------->00:00
2013.03.08 18:14:00 3: newTime------------>08 06:37:00
2013.03.08 18:14:00 3: Zeitstring neu------------>08 06:37:00
2013.03.08 18:14:00 3: Offset-Routine_new liefert: sunrise ist 08 06:37:00
2013.03.08 18:14:00 1: define: the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 06:37:00. 2013.03.08 18:14:00 3: define Sonnenaufgang_new at {Offset_new('sunrise','00:00:00','07:00:00','09:00:00')} set Rollladen_EG 100 : the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 06:37:00. 2013.03.08 18:14:00 3: Rollladen_Yahoo_gesteuert_auf_new return value: the at function "Offset_new('sunrise','00:00:00','07:00:00','09:00:00')" must return a timespec and not 08 06:37:00

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

MisterEltako

mit der Ergänzung:
...
$Zeitstring = sprintf("%02d:%02d:%02d", $Stunden_wetter, $Minuten_wetter, $Sekunden_wetter);

$Zeitstring = substr($Zeitstring,4,11);

if ($Zeitstring lt $Zeit_min) {$Zeitstring = $Zeit_min}
if ($Zeitstring gt $Zeit_max) {$Zeitstring = $Zeit_max}
Log 3,"Offset-Routine_new liefert: $Methode ist $Zeitstring"; return $Zeitstring;
}

dann kommt:

2013.03.08 18:42:12 3: midnight------------>08 00:00:00
2013.03.08 18:42:12 3: 06, 37, 00
2013.03.08 18:42:12 3: Zeit------------>08 06:37:00
2013.03.08 18:42:12 3: Summand----------->00:00
2013.03.08 18:42:12 3: newTime------------>08 06:37:00
2013.03.08 18:42:12 3: Zeitstring neu------------>08 06:37:00
2013.03.08 18:42:12 3: Offset-Routine_new liefert: sunrise ist 09:00:00

MfG,MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

Poste bitte den ganzen Code dann korrigiere ich alles, ein Fehler ist mir leider auch noch unterlaufen.

Ich hatte dir noch keinen voll funktionsfähigen Code sondern ein Beispiel mit dem Kern meiner Idee geschickt, was noch ein wenig Anpassung nötig hatte. Deine Erweiterung greift an der falschen Stelle!
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

so sollte es richtig sein:


sub
Offset($$$$){
my ($Methode, $Summand, $Zeit_min,$Zeit_max) = @_;
my $Zeitstring = ReadingsVal("Local_Wetter","$Methode","nv");

if ($Zeitstring eq "nv") {return "Fehler bei der Wetterabfrage...$Zeitstring"};

my @Summand      = split(/:/, $Summand);
my @Array_wetter = split(/:/, $Zeitstring);

  my $midnight = int (time()/24/3600) * 24*3600 - 3600;
  Log 3, "midnight------------>".strftime("%d %H:%M:%S",localtime($midnight));
  my $Zeit    = $midnight +
       3600*(int($Array_wetter[0])) +
         60*(int($Array_wetter[1])) +
          1*(int($Array_wetter[2]));

  Log 3, "$Methode------------>".strftime("%d %H:%M:%S",localtime($Zeit));
  my $newTime = $Zeit +
       60*(int($Summand[0])) +
        1*(int($Summand[1]));


  Log 3, "Summand----------->$Summand[0]:$Summand[1]";
  Log 3, "plus Summand------>".strftime("%H:%M:%S",localtime($newTime));

  $Zeitstring = strftime("%H:%M:%S",localtime($newTime));
  Log 3, "Zeitstring neu------------>$Zeitstring";

if ($Zeitstring lt $Zeit_min) {$Zeitstring = $Zeit_min}
if ($Zeitstring gt $Zeit_max) {$Zeitstring = $Zeit_max}

return $Zeitstring;
}


leider nur mit Schreibtischtest möglich weil ich "Local_Wetter" nicht definiert habe
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

MisterEltako

Hi!
Vielen Dank! Das war schon fast richtig (s.u.). Jetzt möchte ich noch, das nur "sunset" oder "sunrise" Änderungen das Notify auslösen. Ist das so ok?

fhem.cfg:
define Local_Wetter Weather 12831828 3600 de
attr Local_Wetter localicons 1
attr Local_Wetter event-on-change-reading (sunrise|sunset)

define Rollladen_Yahoo_gesteuert_auf_new notify Local_Wetter:sunset.* {\
    if (defined($defs{Sonnenaufgang_new})) {fhem('delete Sonnenaufgang_new')}\
    fhem("define Sonnenaufgang_new at {Offset_new('sunrise','00:10:00','07:00:00','09:00:00')} set Rollladen_EG 100")}

99_myUtils.pm:
sub
Offset_new($$$$){
my ($Methode, $Summand, $Zeit_min,$Zeit_max) = @_;
my $Zeitstring = ReadingsVal("Local_Wetter","$Methode","nv");

if ($Zeitstring eq "nv") {return "Fehler bei der Wetterabfrage...$Zeitstring"};

my @Summand      = split(/:/, $Summand);
my @Array_wetter = split(/:/, $Zeitstring);

  my $midnight = int (time()/24/3600) * 24*3600 - 3600;
  Log 3, "midnight------------>".strftime("%d %H:%M:%S",localtime($midnight));
  my $Zeit    = $midnight +
       3600*(int($Array_wetter[0])) +
         60*(int($Array_wetter[1])) +
          1*(int($Array_wetter[2]));

  Log 3, "$Methode------------>".strftime("%d %H:%M:%S",localtime($Zeit));
  my $newTime = $Zeit +
     3600*(int($Summand[0])) +
       60*(int($Summand[1])) +
        1*(int($Summand[2]));


  Log 3, "Summand----------->$Summand[0]:$Summand[1]:$Summand[2]";
  Log 3, "plus Summand------>".strftime("%H:%M:%S",localtime($newTime));

  $Zeitstring = strftime("%H:%M:%S",localtime($newTime));
  Log 3, "Zeitstring neu------------>$Zeitstring, $Zeit_min,$Zeit_max";

if ($Zeitstring lt $Zeit_min) {$Zeitstring = $Zeit_min}
if ($Zeitstring gt $Zeit_max) {$Zeitstring = $Zeit_max}
Log 3, "$Zeit_min < $Zeitstring < $Zeit_max";

return $Zeitstring;
}

Nochmals Danke für deine Unterstützung!
MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

Hast recht
Ich habe beim Aufbau meiner Testversion von offset übersehen, dass der Summand auch Sekunden hatte.


event-on-change-reading
 The attribute takes a comma-separated list of readings. You may use regular expressions in that list. If set, only changes of the listed readings create events. In other words, if a reading listed here is updated with the new value identical to the old value, no event is created.1


scheint mir richtig zu sein. Ich würde es aber so formulieren:

attr xxx event-on-change-reading sunrise,sunset

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm