Restlaufzeit umrechnen

Begonnen von no_Legend, 05 Februar 2019, 11:36:05

Vorheriges Thema - Nächstes Thema

no_Legend

Hallo Leute,

hat jemand sich schon drum gekümmert, die Restlaufzeit in Stunden, Minuten und Sekunden umzurechnen?

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

peterk_de

#1
Jain. Die Restlaufzeit rechnet bei mir für FHEM und TabletUI nicedates (Siehe https://forum.fhem.de/index.php/topic,30385.msg249939.html#msg249939) mit Live-Countdown aus. Dazu erzeuge ich über Userreadings einen kompletten Perlzeitstempel für das voraussichtliche Programmende (in dem Userreading readyAt, siehe unten) bzw. "0" wenn es keine Restlaufzeit gibt - und nicedates macht daraus sowas wie "in 5 Minuten".

Im Reading readyAtReadable generiere ich zusätzlich die Uhrzeit vom Ende in Stunden:Minuten, weil das meine Frau lieber mag als die Restlaufzeit.

Das kannst du Dir ja aber nach deinen Wünschen anpassen. Hier der Code für meine Spüler-Userreadings, Waschmaschine sähe etwas anders aus, hätte ich bei Interesse auch noch. Generiert auch noch andere hübsche Readings (lesbarer Programmname, Status auf Deutsch inkl. Endzeitpunkt etc.):

programNameDe {
  my $program = ReadingsVal("kueche.geschirrspueler_hc","BSH.Common.Root.SelectedProgram","");

  if ($program =~ /Eco50/) {"Eco-Programm 50°C"}
  elsif ($program=~ /Auto2/) {"Auto-Programm 45-65°C"}
  elsif ($program=~ /Intensiv70/) {"Intensivprogramm 70°C"}
  elsif ($program=~ /Kurz60/) {"Kurzprogramm 60°C"}
  elsif ($program=~ /Quick45/) {"Kurzprogramm 45°C"}
  elsif ($program=~ /NightWash/) {"Nachtprogramm"}
  elsif ($program=~ /Glas40/) {"Glas-Programm 40°C"}
  elsif ($program=~ /PreRinse/) {"Nur Vorspülen"}
  elsif ($program=~ /MachineCare/) {"Maschinenpflege"}
  else {"Unbekanntes Programm"}
},
readyAt {

  my $deviceName = "kueche.geschirrspueler_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/ || $operationState =~/DelayedStart/) {
    my $nowInSeconds  = time();
   
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }
   
    my $delayDuration = 0;
   
    if ($operationState =~/DelayedStart/) {
   
      $delayDuration = ReadingsVal($deviceName,"BSH.Common.Option.StartInRelative",0);
      if ($delayDuration =~ /(\d+)/) {
        $delayDuration = $1;
      }   
    }
   
    my $readyTimeSec = $nowInSeconds + $programmDuration + $delayDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 120) {
      $readyTimeSec = $oldReadyTimeSec;
    }
    strftime("%Y-%m-%d %H:%M:%S", localtime($readyTimeSec));

  } else {
   "0";
  }
},
readyAtReadable {

  my $deviceName = "kueche.geschirrspueler_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/ || $operationState =~/DelayedStart/) {
    my $nowInSeconds  = time();
   
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }
   
    my $delayDuration = 0;
   
    if ($operationState =~/DelayedStart/) {
   
      $delayDuration = ReadingsVal($deviceName,"BSH.Common.Option.StartInRelative",0);
      if ($delayDuration =~ /(\d+)/) {
        $delayDuration = $1;
      }   
    }
   
    my $readyTimeSec = $nowInSeconds + $programmDuration + $delayDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 120) {
      $readyTimeSec = $oldReadyTimeSec;
    }
    strftime("%H:%M", localtime($readyTimeSec));

  } else {
   "0";
  }
},
stateDe {
  my $operationState = ReadingsVal("kueche.geschirrspueler_hc","BSH.Common.Status.OperationState","");
  my $program = ReadingsVal("kueche.geschirrspueler_hc","programNameDe","");
  my $readyAt = ReadingsVal("kueche.geschirrspueler_hc","readyAtReadable","");

  if ($operationState =~/Run/) {
     "Läuft noch bis $readyAt ($program)";
  } elsif ($operationState =~/Delay/)  {
     "Timer gestellt auf $readyAt ($program)";
  } elsif ($operationState =~/Finished/)  {
     "Fertig";
  } elsif ($operationState =~/Ready/)  {
     "Bereit";
  } elsif ($operationState =~/Inactive/)  {
     "aus";
  } elsif ($operationState =~/Aborting/)  {
     "Abbruch";
  }
}
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

no_Legend

Zitat von: peterk_de am 14 Februar 2019, 09:24:45
Jain. Die Restlaufzeit rechnet bei mir für FHEM und TabletUI nicedates (Siehe https://forum.fhem.de/index.php/topic,30385.msg249939.html#msg249939) mit Live-Countdown aus. Dazu erzeuge ich über Userreadings einen kompletten Perlzeitstempel für das voraussichtliche Programmende (in dem Userreading readyAt, siehe unten) bzw. "0" wenn es keine Restlaufzeit gibt - und nicedates macht daraus sowas wie "in 5 Minuten".

Im Reading readyAtReadable generiere ich zusätzlich die Uhrzeit vom Ende in Stunden:Minuten, weil das meine Frau lieber mag als die Restlaufzeit.

Das kannst du Dir ja aber nach deinen Wünschen anpassen. Hier der Code für meine Spüler-Userreadings, Waschmaschine sähe etwas anders aus, hätte ich bei Interesse auch noch. Generiert auch noch andere hübsche Readings (lesbarer Programmname, Status auf Deutsch inkl. Endzeitpunkt etc.):

programNameDe {
  my $program = ReadingsVal("kueche.geschirrspueler_hc","BSH.Common.Root.SelectedProgram","");

  if ($program =~ /Eco50/) {"Eco-Programm 50°C"}
  elsif ($program=~ /Auto2/) {"Auto-Programm 45-65°C"}
  elsif ($program=~ /Intensiv70/) {"Intensivprogramm 70°C"}
  elsif ($program=~ /Kurz60/) {"Kurzprogramm 60°C"}
  elsif ($program=~ /Quick45/) {"Kurzprogramm 45°C"}
  elsif ($program=~ /NightWash/) {"Nachtprogramm"}
  elsif ($program=~ /Glas40/) {"Glas-Programm 40°C"}
  elsif ($program=~ /PreRinse/) {"Nur Vorspülen"}
  elsif ($program=~ /MachineCare/) {"Maschinenpflege"}
  else {"Unbekanntes Programm"}
},
readyAt {

  my $deviceName = "kueche.geschirrspueler_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/ || $operationState =~/DelayedStart/) {
    my $nowInSeconds  = time();
   
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }
   
    my $delayDuration = 0;
   
    if ($operationState =~/DelayedStart/) {
   
      $delayDuration = ReadingsVal($deviceName,"BSH.Common.Option.StartInRelative",0);
      if ($delayDuration =~ /(\d+)/) {
        $delayDuration = $1;
      }   
    }
   
    my $readyTimeSec = $nowInSeconds + $programmDuration + $delayDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 120) {
      $readyTimeSec = $oldReadyTimeSec;
    }
    strftime("%Y-%m-%d %H:%M:%S", localtime($readyTimeSec));

  } else {
   "0";
  }
},
readyAtReadable {

  my $deviceName = "kueche.geschirrspueler_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/ || $operationState =~/DelayedStart/) {
    my $nowInSeconds  = time();
   
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }
   
    my $delayDuration = 0;
   
    if ($operationState =~/DelayedStart/) {
   
      $delayDuration = ReadingsVal($deviceName,"BSH.Common.Option.StartInRelative",0);
      if ($delayDuration =~ /(\d+)/) {
        $delayDuration = $1;
      }   
    }
   
    my $readyTimeSec = $nowInSeconds + $programmDuration + $delayDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 120) {
      $readyTimeSec = $oldReadyTimeSec;
    }
    strftime("%H:%M", localtime($readyTimeSec));

  } else {
   "0";
  }
},
stateDe {
  my $operationState = ReadingsVal("kueche.geschirrspueler_hc","BSH.Common.Status.OperationState","");
  my $program = ReadingsVal("kueche.geschirrspueler_hc","programNameDe","");
  my $readyAt = ReadingsVal("kueche.geschirrspueler_hc","readyAtReadable","");

  if ($operationState =~/Run/) {
     "Läuft noch bis $readyAt ($program)";
  } elsif ($operationState =~/Delay/)  {
     "Timer gestellt auf $readyAt ($program)";
  } elsif ($operationState =~/Finished/)  {
     "Fertig";
  } elsif ($operationState =~/Ready/)  {
     "Bereit";
  } elsif ($operationState =~/Inactive/)  {
     "aus";
  } elsif ($operationState =~/Aborting/)  {
     "Abbruch";
  }
}


Würde mich freuen wenn du die wama auch not posten würdest.
Trockner hast du zufällig nicht auch noch oder?

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

peterk_de

Nee, nen Homeconnect-Trockner habe ich nicht. Und nach meiner Erfahrung mit der WaMa werde ich auch keinen kaufen, wenn eine Anschaffung mal anstehen sollte ;) Alle 2 Wochen das WLAN wieder anschalten zu müssen ist einfach nur nervig. Und die Laufzeitberechnung ist in eigentlich allen Programmen extrem ungenau, das konnte meine alte Maschine wesentlich besser ... aber immerhin wäscht sie sehr ordentlich ^^

Hier aber nun aber die  Readings für die WaMa:

programNameDe {
  my $program = ReadingsVal("bad.unten.waschmaschine_hc","BSH.Common.Root.ActiveProgram","");
  my $programName = "";

  my $programHasOptions = 1;
  my $programHasTemp = 1;

  if ($program =~ /CottonEco/) {
    $programName = "Baumwolle Eco";
  } elsif ($program=~ /Cotton/) {
    $programName = "Baumwolle";
  } elsif ($program=~ /EasyCare/) {
    $programName = "Pflegeleicht";
  } elsif ($program=~ /Spin/) {
    $programName = "Nur Schleudern";
    $programHasTemp = 0;
  } elsif ($program=~ /Wool/) {
    $programName = "Wolle";
  } elsif ($program eq "-") {
    $programName = "Keins";
    $programHasOptions = 0;
  } else {
    $programName = "Unbekanntes Programm";
    $programHasOptions = 0;
  }

  if  ($programHasOptions) {
     if ($programHasTemp && ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.Temperature",0) =~ /GC(...?)/) {
       $programName .= " $1°C";
     };     
     if (ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.SpinSpeed",0) =~ /RPM(....?)/) {
       $programName .= ", $1 U/min";
     };
     if (ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.Prewash",0)) {
       $programName .= ", Vorwäsche";
     };
     
     if (ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.Stains",0) =~ /\.On$/) {
       $programName .= ", Fleckenbehandlung";
     };
     if (ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.RinsePlus",0) =~ /Plus(\d)/) {
       $programName .= ", $1x extra Spülen";
     };
     if (ReadingsVal("bad.unten.waschmaschine_hc","LaundryCare.Washer.Option.LessIroning",0)) {
       $programName .= ", Knitterschutz";
     };     
  }
  return($programName);
},
readyAt {

  my $deviceName = "bad.unten.waschmaschine_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/) {
    my $nowInSeconds  = time();
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }

    my $readyTimeSec = $nowInSeconds + $programmDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 60) {
      $readyTimeSec = $oldReadyTimeSec;
    }

    strftime("%Y-%m-%d %H:%M:%S", localtime($readyTimeSec));
  } else {
   "0";
  }
},
readyAtReadable {

  my $deviceName = "bad.unten.waschmaschine_hc";

  my $operationState = ReadingsVal($deviceName,"BSH.Common.Status.OperationState","");
  if ($operationState =~/Run/) {
    my $nowInSeconds  = time();
    my $programmDuration = ReadingsVal($deviceName,"BSH.Common.Option.RemainingProgramTime",0);
    if ($programmDuration =~ /(\d+)/) {
      $programmDuration = $1;
    }

    my $readyTimeSec = $nowInSeconds + $programmDuration;
   
    my $oldReadyTimeSec = str2time(ReadingsVal($deviceName,"readyAt",0));
   
    if (abs($oldReadyTimeSec - $readyTimeSec) < 60) {
      $readyTimeSec = $oldReadyTimeSec;
    }

    strftime("%H:%M", localtime($readyTimeSec));
  } else {
   "0";
  }
},
stateDe {
  my $operationState = ReadingsVal("bad.unten.waschmaschine_hc","BSH.Common.Status.OperationState","");
  my $program = ReadingsVal("bad.unten.waschmaschine_hc","programNameDe","");
  my $readyAt = ReadingsVal("bad.unten.waschmaschine_hc","readyAtReadable","");

  if ($operationState =~/Run/) {
     "Läuft noch bis $readyAt";
  } elsif ($operationState =~/Delay/)  {
     "Timer gestellt ($program)";
  } elsif ($operationState =~/Finished/)  {
     "Fertig";
  } elsif ($operationState =~/Ready/)  {
     "Bereit";
  } elsif ($operationState =~/Pause/)  {
     "Pausiert";
  }
}
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

tarum

#4
Hallo zusammen,

hier ist mal meine Zeitumrechnung, falls es jemand braucht.
Meine WM hängt an einer FritzDect 200 die zwar schon etwas älter ist aber zumindest ein Display mit Restzeitanzeige hat, und damit Frauchen nicht immer runter laufen muss habe ich mir da was zusammengelickt ist vielleicht nicht 100%ig aber es erfüllt seinen Zweck :)
Über den Slider kann die Restzeit angegeben werden, und dann wird im Minutentakt runtergezählt.

defmod Restlaufzeit dummy
attr Restlaufzeit devStateStyle style= "color:dodgerblue;;;;text-align:center;;;;font-weight:bold;;;;font-size:18px"
attr Restlaufzeit group Energie
attr Restlaufzeit icon time_clock@lime
attr Restlaufzeit room System
attr Restlaufzeit setList state:slider,0,1,260
attr Restlaufzeit sortby 4
attr Restlaufzeit userReadings Zeitumrechnung {my $hours= sprintf ("%.4f", ReadingsNum("Restlaufzeit","state",0)/60);; my $hh=int($hours);; my $im=$hours - $hh ;; my $m=int($im / 60 * 3600) ;; "$hh Std. $m Min."}, Zeitberechnung {sprintf ("%.2f Std.", ReadingsNum("Restlaufzeit","state",0)/60) }\

attr Restlaufzeit verbose 0
attr Restlaufzeit webCmd state:AUS

setstate Restlaufzeit 78
setstate Restlaufzeit 2019-05-29 18:59:08 Zeitberechnung 1.30 Std.
setstate Restlaufzeit 2019-05-29 18:59:08 Zeitumrechnung 1 Std. 18 Min.
setstate Restlaufzeit 2019-05-29 18:59:08 state 78

defmod myCountdown at +*00:01:00 {if(ReadingsNum("Restlaufzeit",'state',0)>0) {fhem("set Restlaufzeit ".(ReadingsNum("Restlaufzeit",'state',0)-1))}}
attr myCountdown icon time_timer
attr myCountdown verbose 0

setstate myCountdown Next: 19:01:08
setstate myCountdown 2019-05-29 19:00:09 state Next: 19:01:08

defmod Timer readingsGroup Restlaufzeit:<%time_timer@lime>,<Verbleibende&nbsp;;Zeit>,<>,Zeitumrechnung,<>\
Restlaufzeit:<%time_timer@lime>,<Verbleibende&nbsp;;Zeit>,<>,Zeitberechnung,<>\

attr Timer commands {'Start' => "set Restlaufzeit_AN cmd_1", 'Stop' => "set Restlaufzeit_AN cmd_2", 'state' => "set Zeitauswahl state:"}
attr Timer group Energie
attr Timer icon time_timer
attr Timer notime 1
attr Timer room System
attr Timer sortby 5
attr Timer style style="color:dodgerblue;;;;text-align:center;;;;font-weight:bold;;;;font-size:18px"
attr Timer valueIcon {'state' => '%devStateIcon', 'Start' => 'Restart', 'Stop' => 'Shutdown'}

Linux Server 20.04 CUL 868+433, CCU3, Homematic, Intertechno, FritzDect 200, JeeLink+LaCrosse, Duofern Stick+Rollotron Gurtwickler,smartVISU-3.0.0