Zeitangaben in Strings

Begonnen von bugster_de, 25 August 2013, 20:18:02

Vorheriges Thema - Nächstes Thema

bugster_de

So, nun hat das eher schlechte Wetter eine massive Erweiterung des Könnens meiner FHEM Installation zur Folge. Als 'Nebenprodukt' sind dabei ein paar Funktionen abgefallen, die zum Umgang mit Strings dienen. Datei siehe im Anhang

Als erstes gibt es die:
# ------------------------------------------------------------------------
#  Function to fill the variables for the current time
#  Usage: ($success) = myUtils_Set_Timestruct( );
# ------------------------------------------------------------------------
sub TU_Set_Timestruct( );


Diese kann man immer aufrufen, sobald man die aktuelle Uhrzeit braucht. Sie füllt dann die globalen Variablen, auf die man dann direkt zugreifen kann. Die Bedeutung der einzelnen Variablen ist im Code erklärt.

Um einen Offset auf einen Zeitstempel auf zu addieren:
# ------------------------------------------------------------------------
#  Function to increment a time
#  Usage: ($success,$result) = TU_Get_Increment( "hh:mm:ss", "hh:mm:ss" );
# ------------------------------------------------------------------------
#  the success is false (failed) or true (success)
#  the $result is the resulting time string in case of success "hh:mm:ss"
#    empty in case of error
# ------------------------------------------------------------------------
sub TU_Get_Increment( $$ ) {


Hier kann man einen Zeitstempel (z.B. "20:10:15") angeben sowie einen Offset (z.B. "00:12:10"). Als Rückgabe erhält man im zweiten Parameter ($result) die neue Zeit hier: "20:22:25"
Falls irgendwas in den Übergabeparametern nicht stimmt, dann ist $success false und $result enthält nichts.

# ------------------------------------------------------------------------
#  Function to increment a time
#  Usage: ($success,$result) = TU_Get_Increment( "hh:mm:ss", "hh:mm:ss" );
# ------------------------------------------------------------------------
#  the success is false (failed) or true (success)
#  the $result is the resulting time string in case of success "hh:mm:ss"
#    empty in case of error
# ------------------------------------------------------------------------
sub TU_Get_Increment( $$ ) {

Naja, wer Increment verstanden hat, der weiß was diese Funktion macht :-)


# ------------------------------------------------------------------------
#  Function to calculate the difference in between two time stamps
#  Usage: ($success,$result) = TU_Get_Difference( "hh:mm:ss", "hh:mm:ss" );
# ------------------------------------------------------------------------
#  the success is false (failed) or true (success)
#  the $result is the resulting time string in case of success "hh:mm:ss"
#    empty in case of error
#  Please note, that first input string is the starting time and second
#    string is end time. So this is forward calculation
# ------------------------------------------------------------------------
sub TU_Get_Difference( $$ ) {

Der hier berechnet das Delta zwischen zwei Zeitstempeln. Der erste Übergabewert ist dabei der Startpunkt, der zweite der Endpunkt. Sinnvoll, wenn man z.B. die Laufzeit einer Pumpe berechnen möchte.


# ------------------------------------------------------------------------
#  Function to check and split a given time string
#  Usage: ($success,hour,min,sec) = TU_Get_SplitTimeString( "hh:mm:ss" );
# ------------------------------------------------------------------------
#  the success is false (failed) or true (success)
#  the hour, min, sec is the resulting time values as scalars
#    empty in case of error
# ------------------------------------------------------------------------
sub TU_Get_SplitTimeString( $ ) {

Und der hier zerlegt einen Zeitstempel in seine Bestandteile.


Viel Spass damit für diejenigen, die es brauchen können.


bugster_de

Und für alle, die sich fragen, für was man das braucht, hier mal ein paar Anwendungsfälle, die ich heute umgesetzt habe

- Poolpumpe
die Pumpe am Pool sollte min. 4 Stunden am Tag laufen. Wenn man badet läuft die Pumpe ja eh, also könnte man sich das Laufenlassen nachts sparen. Nun ermittle ich die Gesamtlaufzeit der Pumpe am Tag, wenn sie manuell geschaltet wird und lasse nachts nur noch die Restlaufzeit, die noch fehlt laufen

- Rolladen
Alle Rolläden fahren automatisch abend runter und morgens rauf. Morgens entscheidet FHEM an Hand der Wetter daten, ob die Rolläden ganz auf sollen oder ob man Beschattung macht. Je nachdem gehen die Rolläden dann zu einer bestimmten Uhrzeit (z.b. 08:30:00) in die gewünschte Position per at.
Wenn man nun aber länger schlafen möchte, dann habe ich eine Funktion mittels Intertechno Fernbedienung umgsetzt, die das öffen verzögert: wenn man einmal drückt, denn gehe sie eine Stunde später, wenn man 2 mal drückt 2 Stunden später usw.

-Rolläden
das Thema MISSING ACK bei Homematic ist ja bekannt. Es scheint am besten zu gehen, wenn man die Befehele an die Homematic Aktoren in einem Abstand von 2 Sek. per at sendet. Nun kann ich auf Basis einer vorgegebenen Startzeit einfach alle Rolläden schön im Abstand von 2 Sek. runterlaufen lassen.

RoqueNublo

Hallo bugster_de,

da ich z.Zt. auf der Suche nach Codeschnipseln bin um meinem Floorplan eine möglichst dynamische Ablaufsteuerung zu geben, bin ich u.a. auf Dein Perlscript ,,Zeitangaben in Strings" gestoßen.
Auch die von Dir aufgezeigten Verwendungsbeispiele erscheinen mir zur Erreichung meines Vorhabens recht Interessant seinen.

Eine Bitte. Könntest Du einige Aufrufbeispiele (fhem.cfg) posten, z.B. zu den von Dir vaufgezeigten Verwendungsbeispielen.

Gruß RoqueNublo

moonsorrox

das hört sich sehr interessant an, was man da mit den Rollläden machen kann, da ich mich gerade damit beschäftige wie ich das leidige Thema der Rollläden "Öffnen" am Morgen so machen kann das es bei Sonne nur 10%, 20% oder auch 30% beschattet wäre dies für mich auch gut an einem Beispiel zu sehen, da noch blutiger Anfänger
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

bugster_de

Hi,

ZitatKönntest Du einige Aufrufbeispiele (fhem.cfg) posten
mit der fhem.cfg hat das nichts zu tun. Die Funktionen werden in den jeweiligen perl Skripten aufgerfufen. Diese kann man z.B. durch ein notify aufrufen.

Als Nutzungsbeispiele dann z.B. folgendes:

der Code addiert 5 Minuten zur Zeit 12:13:27 hinzu
my $res = true;
my $newtime = "";
($res, $newtime) = GU_Get_Increment( "12:13:27", "00:05:00" );
if( res == false ) {
    Log 1, "Fehler";
}

$newtime enthält jetzt einen String mit "12:18:27"

der hier holt erstmal die aktuelle Zeit und addiert dann 5 Min. hinzu und steuert einen Aktor mittels Timer an
# Rueckgabewerte definieren
my $res = true;
my $newtime = "";

# globale Zeitstrukturen definieren
TU_Set_TimeStruct( );

# auf die aktuelle Zeit 5 Min drauf addieren
($res, $newtime) = GU_Get_Increment( $str_hourminsec, "00:05:00" );
if( res == false ) {
    Log 1, "Fehler";
}

# und die neue Zeit in einem Timer nutzen
fhem( "define mytimer at " . $newtime . " set myactor on" );


das ganze funktioniert dann auch analog mit GU_Get_Decrement

Und hier die Berechnung einer Zeitdifferenz
my $res = true;
my $timediff = "";
($res, $timediff) = GU_Get_Difference( "12:13:27", "13:18:37" );
if( res == false ) {
    Log 1, "Fehler";
}

die Variable $timediff enthält nun den Wert "01:05:10"

Und die letzte Funktion nutzt man so:
my $res = false;
my $hour;
my $min;
my $sec;

($res, $hour, $min, $sec ) = GU_Get_SplitTimeString( "12:13:27" );

$hour ist jetzt 12
$min ist jetzt 13
$sec ist jetzt 27
Somit kann man diesen Skalaren entsprechend rechnen


RoqueNublo

Hallo,

danke für die Rückmeldung. Da ich in perl nicht so fit bin, kannst Du mir vielleicht meine Fragen beantworten.

In den Beispielen werden die Funktionen mit GU_Get_.... aufgerufen. In Deiner Bibliothek heißen sie aber TU_Get_..., könnte es sein, dass hier ein Tipfehler vorliegt.

Eine weitere Syntax führt bei mir zu Fehlern. Die Anweisung ,,if ( res == false )" geht bei mir nur ohne Fehler durch, wenn ich sie wie folgt schreibe ,,if ( $res == false )". Woran liegt das?

Vorweg erst einmal Danke für Deine Unterstützung.

Gruß
Roque

baukater

Wenn ich die Funktionen kopieren möchte, dann erhalte ich nur den sichtbaren Teil. Fehlt der Rest. Die Funktionen für die Uhrzeitberechnungen
finde ich ganz nütztlich, um zeitversetzt Aktionen auszulösen.
FB7490,Raspi 2/3,HM-Lan,Jeelink Classic (868),Logilink BT0015 Bluetooth 4.0, 2x mySmartUSB light,RS485USB , entities:272 device:14 channel:27 virtual:1, 6 x HM-LC-BL1-FM,4 x HM-LC-SW4-WM, 1 x HM-LC-SW2-FM,1 x Fensterkontakt,1 1x Türkontakt, 1 1x Bewegungsmelder, DECT-200,DECT100,6xAuthentic Xiaom

bugster_de

stimmt, und deshalb ist der komplette Code ja als Datei im ersten Post angefügt. Datei runterladen --> ins FHEM/FHEM verzeichniss kopieren --> reload und los gehts

UliM

Hi,
magst Du das mal einchecken? M.E. am besten mit Rudi abstimmen und mit in 99_Utils.pm aufnehmen incl dortiger commandref-Doku .

Alternativ ins contrib einchecken.

Und vielleicht nen Wiki-Artikel dazu.

Wär doch schade wenn das hier versandet...

Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

bugster_de

Hi,

kann ich gerne machen, wird aber frühestens am Wochenende passieren.

Allerdings mal unter uns Perl-Programmierungspfarrertöchtern: diese Routinen funktionieren bei mir jetzt seit einem dreiviertel Jahr problemlos und haben somit im besten Ingenieurs-Sinne die Tauglichkeit bestanden. Allerdings sind sie nicht sehr robust gegen Fehlbedienung programmiert. Eine Uhrzeit wie "26:83:95" wird genauso akzeptiert wie "AM:X3:17". Ich habe eine Prüfung per RegExp wegen des hohen Rechenaufwandes mal gescheut.

Viele Grüße

Rince

It's not a bug, it's a feature:
Wenn fhem mal zur Steuerung von Mars Missionen eingesetzt wird, ist es schon mit Mars-Tagen kompatibel.

Ich würde mir daher diesbezüglich keine schlaflosen Nächte bereiten.
(auch wenn ich vermutlich da drüber stolpern werde ;) )
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

prime1009

Hi,

habe die Datei ins Verzeichnis kopiert und reload gemacht. Bekomme beim Aufruf der Funktion allerdings immer die Meldung:

... return value: Undefined subroutine &main::TU_Set_TimeStruct called at ./FHEM/99_MyUtils.pm line 25

was könnte ich da noch falsch machen?

Gruß und Dank
FHEM 5.7 auf RasPi3
Homematic, IT, FS20, Cams (SSCAM), CUL, HueBridge, HarmonyHub, LIGHTIFY, TelegramBot, Homebridge (Siri), DBLog mit MySQL, Text2Speech, ...

Kakaomonster

Hallo zusammen,

auch wenn hier seit 120 Tagen nichts mehr geschrieben wurde, denke ich das es die möglichkeit ist nach der ich suche.

Was möchte ich:
Geräte, die eingeschaltet werden sollen überprüft werden, wie lange sie an sind (onlinezeit) innerhalb vom 01. - letzten Tag eines Monats.
Diese Zeit soll dann brechnet werden mit der Watt Zahl des jeweiligen Gerätes und danach mit dem Strompreis. Somit könnte man auch ohne zusätzliche Hardware die verbrauchskosten annähernd berechnen.

Ich glaube das sowas mit o.g. Code möglich wäre, komme aber auch nach langem suchen und testen damit nicht klr. hat vielleicht schon jemand soetwas oder interesse das zu basteln?

Also der Plan wäre dann ungefähr so:
Gerät on bis off in einen Dummy schreiben, nennen wir ihn "Dummy OnlineAktuell"
Diesen "Dummy Online Aktuell" hinzufügen (also addieren zu) "Dummy OnlineTag"
Diesen "Dummy OnlineTag" wiederum zu "Dummy OnlineMonat" addieren

Damit das alles am Ende vom Monat nicht verloren geht, sollte es dann noch den Dummy MonatJahr geben, indem jeweils das Monatsergebniss aufbewahrt undvielleicht ebenfalls ausgewertet werden kann.

Das alles in eine tabelle auslesen und man hat eine übersicht.

Ich habe lange gesucht und war eigentlich der Meinung das ich was ähnliches im Sommer letztes Jahr im Forum gefunden hatte, aber ich finde  es nicht mehr :-(

Grüßen und ein schönes Wochenende, auf das sich wenigstens jemnd meldet, Kakaomonster
FHEM auf Raspi m.12cm Antenne, BBB als Server für Zusatz (apache,php,sql)
1 USB CUL/RAW (ReadAnswer):  V 1.61
2 MAX Thermostate, 1 MAX Wanthermostast
1 FHT8V Thermostat, Schaltaktoren,Bewegungsmelder, Wandtatser Elro & IT
1 HMT 360, 4 7"Tablets, FB 7490

Spartacus

Hallo,
spiele gerade auch mit der Funktion. Aber m.E. ist hier ein Fehler drin:
{TU_Get_Increment ("20:00:01", "10:00:00")}

Kommt 00:00:01 raus. Da müsste aber 06:00:01 rauskommen, oder?

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

fiedel

Hi,

ZitatWas möchte ich:
Geräte, die eingeschaltet werden sollen überprüft werden, wie lange sie an sind (onlinezeit) innerhalb vom 01. - letzten Tag eines Monats.
Diese Zeit soll dann brechnet werden mit der Watt Zahl des jeweiligen Gerätes und danach mit dem Strompreis. Somit könnte man auch ohne zusätzliche Hardware die verbrauchskosten annähernd berechnen.

Elektrolurch hat genau zu diesem Thema kürzlich ein Modul veröffenlicht.

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423