[Gelöst] Uhrzeit von "at" device in signed 32 Bit integer konvertieren

Begonnen von Thomas41587, 06 September 2019, 12:41:15

Vorheriges Thema - Nächstes Thema

Thomas41587

Hallo zusammen,
ich habe zwei "at" devices, die mir die Sonnenaufgangszeit bzw. Untergangszeit anzeigen. Die Uhrzeiten möchte ich über     
S7_AWrite an meine Siemens SPS übertragen. Als Zieldatentyp habe ich ein signed 32 Bit Integer.

Der signed 32 Bit Integer verhält sich dabei auf der SPS-Seite wie folgt:
1000 entspricht 1 Sekunde (1000ms)
Um z.B 17:30:00 Uhr darzustellen wäre folgende Rechnung notwendig:
17*60 (Stunden)
+ 30x60 (Minuten)
+ 0x60 (Sekunden)
x1000

Soweit so gut. Aber wie bekomme ich jetzt die Uhrzeit (state z.B. "Next: 06:17:52") in mein S7_AWrite? Ich würde hier zu einem notify tendieren, allerdings ist mir schleierhaft, wie ich zum einen den Text "Next: " weg bekomme und wie ich die Stunden/Minuten/Sekunden-Anteile extrahiert bekomme um sie zum rechnen nutzen zu können. Kann mir hier eventuell jemand Hilfestellung geben?

Wzut

#1
my (undef,$h,$m,$s) = split(':' , dein Next: 06:17:52 String);
dann mit den drei Werten wie in deinem Beispiel weitermachen
my $val = (3600*int($h)+(60*$m)+$s;
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Thomas41587

Vielen Dank für die Anwort erst einmal. Und sorry für die "blöde" Anfängerfrage, aber: wo definiere ich das ganze? Es handelt sich ja hierbei nicht um ein device, bzw um den Inhalt eines device-Attributs, oder?

Beta-User

Vielleicht eine doofe Frage, aber wenn ich es richtig verstanden habe, willst du "irgendwann" einmal am Tag, vermutlich kurz nach Mitternacht, die aktuellen Sonnenaufgangs-/untergangs-Daten an die SPS schicken.

Dafür würde ich _ein_ at definieren, das eben kurz nach Mitternacht die Daten für den heutigen Tag ermittelt (z.B. mit sunrise_abs() aus
SUNRISE_EL). Da kommt gleich hh:mm:ss, so dass du direkt https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit verwenden kannst. Dann aus dem at direkt diese beiden weiterberechneten Daten (in Milli-Sekunden) an die SPS schicken.

Ich würde das in eine vom at aufzurufende myUtils-Routine packen, aber du kannst den Perl-Code auch direkt im at haben.

(Btw.:
- Es gibt ein paar Konstanten zum Rechnen mit Zeiten, die überall in FHEM verfügbar sind: MINUTESECONDS, HOURSECONDS, DAYSECONDS
- Auch das Modul Astro liefert Sonnendaten, das scheint "genauer" zu sein, selber Funktionsaufruf, aber "a" davor)


Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Wzut

Zitat von: Thomas41587 am 06 September 2019, 13:01:05
wo definiere ich das ganze?
hab ich nicht beantwortet da du ja bereits das notify  in den Raum geworfen hast.
An der Antwort von Beta_User siehst du schon das du X Möglichkeiten für Y Lösungswege hast.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Thomas41587

Danke für die schnelle Hilfe und die guten Tipps!
Ich habe mich dazu entschieden, das ganze über das notify zu lösen. Falls jemand über den Thread stolpert, hier ist der fertige define. Die Formel wurde nochmal korrigiert, hier passte die berechnung der Stunden nicht:
defmod notify_sonnenaufgang_an_PLC notify Sonnenaufgang {\
  my (undef,$h,$m,$s) = split(':' , $EVENT);;;;\
  my $wert = (int($h)*60*60+int($m)*60+($s))*1000;;;;\
  fhem("set S7_AWrite_haus_sonnenaufgang $wert");;;;\
}


Dabei ist "Sonnenaufgang" ein at device und "S7_AWrite_haus_sonnenaufgang" entsrpechend ein S7_AWrite

rabehd

Ein notify, welche auf ein at reagiert. :o
Kann man machen, klingt so aber nach "durch die Brust ins Auge"

Mich würden schon Deine at interessieren.
Zitatich habe zwei "at" devices, die mir die Sonnenaufgangszeit bzw. Untergangszeit anzeigen.
Der Sinn erschließt sich mir nicht.

Schade, das Du die Frage von Beta-User nicht beantwortet hast.
Zitatwillst du "irgendwann" einmal am Tag, vermutlich kurz nach Mitternacht, die aktuellen Sonnenaufgangs-/untergangs-Daten an die SPS schicken.
Auch funktionierende Lösungen kann man hinterfragen.