Autor Thema: Restlaufzeit umrechnen  (Gelesen 1019 mal)

Offline no_Legend

  • Hero Member
  • *****
  • Beiträge: 1135
Restlaufzeit umrechnen
« am: 05 Februar 2019, 11:36:05 »
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.

Offline peterk_de

  • Sr. Member
  • ****
  • Beiträge: 759
Antw:Restlaufzeit umrechnen
« Antwort #1 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";
  }
}
« Letzte Änderung: 14 Februar 2019, 09:28:21 von peterk_de »
FHEM auf 2xNUC Proxmox Cluster
7xFHEM2FHEM-Roomnodes
Frontends: 4x TabletUI, HomeKit, Grafana, StreamDeck
IOdevs: 3xHM, 2xHueBridge, CUL868, HarmonyHub
Devices: 73xHomematic, 53xZigBee, 19xTechem, 17xLAN/WiFi, 12xBTLE, 5xIPCAM, 4xSONOS, 2xHomeConnect, DENON, Kfz-OBD2/GPS-Tracker, ..
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline no_Legend

  • Hero Member
  • *****
  • Beiträge: 1135
Antw:Restlaufzeit umrechnen
« Antwort #2 am: 25 Mai 2019, 19:13:04 »
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.

Offline peterk_de

  • Sr. Member
  • ****
  • Beiträge: 759
Antw:Restlaufzeit umrechnen
« Antwort #3 am: 28 Mai 2019, 11:28:24 »
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 2xNUC Proxmox Cluster
7xFHEM2FHEM-Roomnodes
Frontends: 4x TabletUI, HomeKit, Grafana, StreamDeck
IOdevs: 3xHM, 2xHueBridge, CUL868, HarmonyHub
Devices: 73xHomematic, 53xZigBee, 19xTechem, 17xLAN/WiFi, 12xBTLE, 5xIPCAM, 4xSONOS, 2xHomeConnect, DENON, Kfz-OBD2/GPS-Tracker, ..

Offline tarum

  • New Member
  • *
  • Beiträge: 34
Antw:Restlaufzeit umrechnen
« Antwort #4 am: 29 Mai 2019, 18:58:34 »
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'}
« Letzte Änderung: 29 Mai 2019, 19:02:28 von tarum »
Linux Server 14.04 CUL 868+433, Homematic Intertechno FritzDect 200 JeeLink LaCrosse, Duofern Stick+Rollotron Gurtwickler