Hauptmenü

[gelöst] Datum zu Wochentag

Begonnen von Brad Majors, 20 Januar 2023, 12:59:36

Vorheriges Thema - Nächstes Thema

Brad Majors

Ich weiß das Thema wurde schon oft hier behandelt.

Aber egal was ich versuche es funktioniert nicht.
Habe mich auch schon mit den 99_myUtils beschäftigt.

Eigentlich hätte ich gerne das von einem simplen reading z.B. der Tag "WetterProplanta:fc0_date" übersetzt wird.

So was hier funktioniert.

{getDayOfWeek() } ()(()<999

{getDayOfWeek (({TimeNow})}

{return strftime("%A",localtime)}      >      ok.   Result = Friday
{return strftime("%F",localtime)}       >      ok.   Result = 2023-01-20   

In my utils habe ich das versucht:

# Liefert Wochentag (0 (So) - 6 (Sa)).
# Param: Datum ('24.12.2015')

sub getDayOfWeek($){ 
my $datum_str = shift || return -1; 
my($day, $month, $year) = split /\./, $datum_str; 
return -1 if $day < 1 or $day > 31; 
return -1 if $month < 1 or $month > 12; 
my $time = timelocal(0, 0, 0, $day, $month - 1, $year); 
return (localtime($time))[6]; 
}

1;


Aber dann fehlt mir das Wissen das entsprechend umzusetzen.

Habe von Perl leider keine Ahnung.

Bräuchte den Wochentag halt an mehreren Stellen.

Das entsprechende userreading hätte ich auch schon.

fc0_date_WD {ReadingsVal("WetterProplanta","fc0_date",0)}

Wie bekomme ich jetzt dem beigebracht das anstelle 20.01.2023 dort Freitag erscheint.

Habe geschätzt 6-7 Stunden mit allem möglichen, auch aus dem Forum hier versucht.

Bin aber leider zu blöd wie es ausschaut.




Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

Otto123

Du bist hier vor allem falsch - schau mal was hier oben drüber steht -> https://forum.fhem.de/index.php/topic,47490.0.html
Im Wiki gibt es sowas, vielleicht für deinen Fall etwas umständlich? https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit#Beispiel:_Wochentag_zu_Datum
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Du übernimmst einfach die vor wenigen Tagen hier vorgeschlagene Funktion in der myUtils und übergibst in deinem userReadings  der Funktion das ReadingsVal("WetterProplanta","fc0_date",0).

Brad Majors

Zitat von: Otto123 am 20 Januar 2023, 13:16:35
Du bist hier vor allem falsch - schau mal was hier oben drüber steht -> https://forum.fhem.de/index.php/topic,47490.0.html
Im Wiki gibt es sowas, vielleicht für deinen Fall etwas umständlich? https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit#Beispiel:_Wochentag_zu_Datum

sh...... Das hatte ich übersehen. Sorry.

Kannst du es verschieben?


Den WIKI Eintrag hatte ich auch gelesen, bekam es aber nicht hin das es bei mir funktioniert hat.
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

TomLee

ZitatDen WIKI Eintrag hatte ich auch gelesen, bekam es aber nicht hin das es bei mir funktioniert hat.

Das klappt noch genauso wie an dem Tag als ich es dort festgehalten habe, zeig mal deinen Versuch ?

Verschieben musst du, ganz unten links.

Brad Majors

#5
Zitat von: TomLee am 20 Januar 2023, 13:19:09
Du übernimmst einfach die vor wenigen Tagen hier vorgeschlagene Funktion in der myUtils und übergibst in deinem userReadings  der Funktion das ReadingsVal("WetterProplanta","fc0_date",0).

ist so eingetragen, da waren auch noch 2-3 andere Versuche drin.

##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

sub secondsSinceReadingChange($$) {
my ($device, $reading) = @_;
my $readingsTimestamp = ReadingsTimestamp($device, $reading, "failed");

if ($readingsTimestamp ne "failed") {
return time() - time_str2num($readingsTimestamp);
} else {
return -1;
}
}

# Liefert Wochentag (0 (So) - 6 (Sa)).
# Param: Datum ('24.12.2015')

sub getDayOfWeek($){ 
my $datum_str = shift || return -1; 
my($day, $month, $year) = split /\./, $datum_str; 
return -1 if $day < 1 or $day > 31; 
return -1 if $month < 1 or $month > 12; 
my $time = timelocal(0, 0, 0, $day, $month - 1, $year); 
return (localtime($time))[6]; 
}

sub wochentag{
my @weekdays = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
return $weekdays[((localtime(time))[6])];
}


1;


Ich verstehe nicht genau wie ich das machen soll

deinem userReadings  der Funktion das ReadingsVal("WetterProplanta","fc0_date",0).

In meinem Proplanta Modul kommen ca. 200 readings an.

So meinst du es aber nicht?
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

rabehd

Dem userreading fehlt sein Name
Auch funktionierende Lösungen kann man hinterfragen.

TomLee

#7
Für die Kommandozeile:
attr WetterProplanta userReadings fc0_date_WD:fc0_date.* {wochentag(ReadingsVal($name,'fc0_date','nA'))}

TomLee

Zitatsub wochentag{
my @weekdays = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
return $weekdays[((localtime(time))[6])];
}

Die zwei "Schleifchen" sind mMn. nur Deko, vermutlich damit das Kind hübsch aussieht als es vorgestellt wurde, die könntest dir sparen.

Brad Majors

#9
Zitat von: TomLee am 20 Januar 2023, 14:34:46
Für die Kommandozeile:
attr WetterProplanta userReadings fc0_date_WD:fc0_date.* {wochentag(ReadingsVal($name,'fc0_date','nA'))}


Danke schön, hat funktioniert. Du hast mein WE gerettet :).

Habe mir direkt (jetzt wo ich das Prinzip verstanden habe) noch eine short Variante eingetragen.

sub wochentagshort{
my @weekdays = qw(So Mo Di Mi Do Fr Sa);
return $weekdays[((localtime(time))[6])];
}


Die letzte Frage und dann bin ich durch.

In dem Proplanta gibt es WD:fc0_date, WD:fc1_date, WD:fc2_date, usw.

Wenn ich jetzt die Userreadings für 5 unterschiedliche fc.... haben möchte, geht das auch?
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

Otto123

#10
attr WetterProplanta userReadings fc0_date_WD:fc0_date.* {wochentag(ReadingsVal($name,'fc0_date','nA'))}, fc1_date_WD:fc1_date.* {wochentag(ReadingsVal($name,'fc1_date','nA'))}
usw :)
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Du kannst userReadings haben, soviele Du willst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#12
das Reading fc... (die Angabe nach dem Doppelpunkt) ist der Readingname des trigger (Auslöser ist das zugehörige Event (hier alles -> .*) für die Änderung des userReadings, den kannst du nach belieben angeben.

Brad Majors

Das muß ich jetzt nicht verstehen?

attr WetterProplanta userReadings fc0_date_WD:fc0_date.* {wochentag(ReadingsVal($name,'fc0_date','nA'))}, fc1_date_WD:fc1_date.* {wochentag(ReadingsVal($name,'fc1_date','nA'))}

Ergebnis fc0 passt:

fc0_date           =     20.01.2023
fc0_date_WD    =     Freitag


Ergebnis fc1_date_WD passt nicht:

fc1_date           =     21.01.2023
fc1_date_WD    =     Freitag

er bleibt immer beim Freitag?
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

betateilchen

Zitat von: Brad Majors am 20 Januar 2023, 15:41:10
Das muß ich jetzt nicht verstehen?
...
er bleibt immer beim Freitag?

Das ist doch völlig logisch.

Deine Funktion wochentag() erwartet überhaupt keinen Parameter, sondern ermittelt den Wochentag immer aus der aktuellen Uhrzeit.

Zitat(localtime(time))[6]


Ich saß hier schon die ganze Zeit mit meinem Popcorn und habe darauf gewartet, dass es irgendeinem der Schlaumeier hier im Thread auffällt...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!