Reading auftrennen und verarbeiten

Begonnen von jfi1310, 19 Juli 2019, 13:49:05

Vorheriges Thema - Nächstes Thema

jfi1310

Hallo zusammen,

ich habe vor, eine Garage für einen Husqvarna Automower automatisch zu steuern.
Dazu habe ich mittels FHEM, Relais und einem Rolladenmotor eine Steuerung aufgebaut. Mit dem Modul 74_HusqvarnaAutomower.pm kann ich den des Roboters auslesen und entsprechend schalten.

Grundsätzlich funktioniert die automatische Steuerung bereits. Allerdings stehe ich noch vor einem Problem: Durch die Verzögerung über die Cloud und das Aktualisierungsintervall (60s) öffnet das Garagentor nicht schnell genug, wenn der Mäher startet.

Eines der Readings des Moduls ist das Reading "mower_nextStart". Hier wird angegeben, wann der Mäher das nächste Mal startet. In diesem Reading steht beispielsweise "Tomorrow at 10:00" oder "Today at 11:52".
Damit habe ich folgendes vor: Aus dem Reading möchte ich so splitten, dass ich die Uhrzeit in einem Reading habe. Anschließend möchte ich davon 5 Minuten abziehen, sodass das Garagentor 5 Minuten vor dem nächsten Start geöffnet wird.

Das splitten habe ich folgendermaßen versucht:
next_start_time_short { (split ' ',ReadingsVal("myMower","mower_NextStart",0))[3]}
Hier bekomme ich gar keine Ausgabe.

Außerdem habe ich versucht, ein UserReading zu erstellen:
next_start_time { ReadingsVal("myMower","mower_NextStart",0) }
Hier wird mir nur eine "0" ausgegeben.

Wer kann mir hier weiterhelfen?
Vielen Dank!

Freundliche Grüße
jfi1310

DeeSPe

next_start_time_short { (split ' ',ReadingsVal("myMower","mower_NextStart",0))[2]}
sollte gehen.
Split fängt bei 0 an zu zählen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

jfi1310

Zitat von: DeeSPe am 19 Juli 2019, 13:58:02
next_start_time_short { (split ' ',ReadingsVal("myMower","mower_NextStart",0))[2]}
sollte gehen.
Split fängt bei 0 an zu zählen.

Gruß
Dan

Danke für die Antwort!
Leider hat die Änderung nicht geholfen.

next_start_time { ReadingsVal("myMower","mower_NextStart",0) }

Dieses userReading zeigt auch weiterhin nur "0" an. Woran könnte das liegen? Vermutlich hängen die Probleme zusammen?

jfi1310

Zitat von: jfi1310 am 19 Juli 2019, 15:17:42
Danke für die Antwort!
Leider hat die Änderung nicht geholfen.

next_start_time { ReadingsVal("myMower","mower_NextStart",0) }

Dieses userReading zeigt auch weiterhin nur "0" an. Woran könnte das liegen? Vermutlich hängen die Probleme zusammen?

Problem gefunden. Ich hatte einen Groß-/Kleinschreibungsfehler im Reading. Es heißt nämlich "mower_nextStart" und nicht "mower_NextStart".

jfi1310

Nun brauche ich aber noch Hilfe bei der weiteren Verarbeitung.

Ich möchte von der Zeitangabe, die mir im Reading "next_start_time" in HH:MM angegeben wird, 5 Minuten abziehen.

Dafür habe ich mir hieran orientiert: https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit#Addition_zu_einem_Zeitstempel

next_opening {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("myMower","next_start_time","00:00"))-5*60))}

In dem neuen Reading next_opening wird mir allerdings immer nur die aktuelle Uhrzeit angegeben. Was mache ich falsch?

Byte09

edit beitrag gelöscht : den letzten post nicht richtig gelesen

gruss Byte09

Beta-User

#6
Hm, also eigentlich brauchst du einen Timer (einfachster Fall: "at"-Gerät definieren per defmod), das zum richtigen Zeitpunkt den Befehl gibt, das Tor zu öffnen.

Die ganze Umpackerei mit den userReadings ist dafür m.E. suboptimal, zumal du vermutlich auch selbst keine Erklärung hast, warum du plötzlich "die Pferde wechselst" (wo kommt denn auf einmal ReadingsTimestamp her?).

Vorschlag: Du baust erst mal den Perl-Code, um die richtige Öffnen-Zeit zu errechnen (den kannst du in geschweiften Klammern in der Kommandozeile austesten...). Die passende Fundstelle betr. die diversen Umrechnungserfordernisse hast du ja gefunden.

Dann setzt du ein notify auf Änderungen von "mower_nextStart" an, und definierst dann das betreffende at unter Verwendung des gefundenen Codes.

Klingt komplizierter, als es ist...

Nachtrag: Das mit den userreadings ohne spezifizierten Trigger ist an sich schon suboptimal, aber evtl. gibt es hier das zusätzliche Problem, dass userreadings für das eigene Device afaik keine Trigger absetzen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Hi,
ich nehme ja an: Du willst ReadingsVal("myMower","next_start_time","00:00") ansttat ReadingsTimestamp :)
next_opening {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsVal("myMower","next_start_time","00:00"))-5*60))}
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

Byte09

Zitat von: jfi1310 am 19 Juli 2019, 16:07:04
..
next_opening {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("myMower","next_start_time","00:00"))-5*60))}



hab jetzt nochmal geschaut, mit deiner codezeile stimmt was nicht , habe sie jetzt aber nicht weiter auseinandergeplückt.

so geht es in jedem fall, musst / kannst du ja selber wieder zusammen 'kürzen' und die feste zeit gegen das reading ersetzen.

my $next_opening = time_str2num("2019-07-19 20:15:00");
$next_opening = $next_opening -5*60;
$next_opening = POSIX::strftime("%H:%M",localtime($next_opening));



gruss Byte09

jfi1310

Zitat von: Byte09 am 19 Juli 2019, 16:48:48
hab jetzt nochmal geschaut, mit deiner codezeile stimmt was nicht , habe sie jetzt aber nicht weiter auseinandergeplückt.

so geht es in jedem fall, musst / kannst du ja selber wieder zusammen 'kürzen' und die feste zeit gegen das reading ersetzen.

my $next_opening = time_str2num("2019-07-19 20:15:00");
$next_opening = $next_opening -5*60;
$next_opening = POSIX::strftime("%H:%M",localtime($next_opening));



gruss Byte09


Das Reading kommt aber trotzdem in " ", oder?
Und dann schreibe ich das in die config-Datei?

Otto123

Zitat von: jfi1310 am 19 Juli 2019, 17:07:38

Das Reading kommt aber trotzdem in " ", oder?
Und dann schreibe ich das in die config-Datei?
Schau doch einfach mal meinen Vorschlag an  ::) ich habe es getestet...
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

jfi1310

#11
Zitat von: Otto123 am 19 Juli 2019, 17:23:12
Schau doch einfach mal meinen Vorschlag an  ::) ich habe es getestet...

Das habe ich probiert, allerdings komme ich da auch nicht ans Ziel. Da das tatsächliche Reading aktuell leer ist, habe ich mir zum Testen ein Reading "testReading" erstellt, das "10:00" enthält.

{POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsVal("myMower","testReading","00:00"))-5*60))}
Dieser Code liefert mir als Wert jedoch 00:55 zurück. Die Minuten passen also, aber warum die Stunden nicht?

EDIT: Die richtige Minutenangabe scheint Zufall zu sein. Testweise habe ich das testReading auf 11:39 geändert und es wird immer noch 00:55 angezeigt.

Byte09

#12
Zitat von: jfi1310 am 19 Juli 2019, 17:29:36
Das habe ich probiert, allerdings komme ich da auch nicht ans Ziel. Da das tatsächliche Reading aktuell leer ist, habe ich mir zum Testen ein Reading "testReading" erstellt, das "10:00" enthält.

{POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsVal("myMower","testReading","00:00"))-5*60))}
Dieser Code liefert mir als Wert jedoch 00:55 zurück. Die Minuten passen also, aber warum die Stunden nicht?

EDIT: Die richtige Minutenangabe scheint Zufall zu sein. Testweise habe ich das testReading auf 11:39 geändert und es wird immer noch 00:55 angezeigt.

kommt daher, das dein reading "myMower","testReading" im falschen format vorliegt (10:00). time_str2num benötigt aber folgendes format: 2019-07-19 10:00:00

ohne gewähr ;-)

Zitattime_str2num("YYYY-MM-DD HH:MM:SS") wandelt einen FHEM-Zeitstempel in Sekunden um

gruss Byte09

jfi1310

Das heißt, ich müsste das Datum und die Sekunden ergänzen.

Beim Datum habe ich ja die Angabe, ob der nächste Start heute, morgen oder an einem anderen Tag ist. Da wäre es also gut, auch das passende Datum anzugeben.
Bei den Sekunden reicht es ja, :00 hinten anzuhängen, aber wie?

Byte09

#14
Zitat von: jfi1310 am 19 Juli 2019, 17:53:43
Das heißt, ich müsste das Datum und die Sekunden ergänzen.

Beim Datum habe ich ja die Angabe, ob der nächste Start heute, morgen oder an einem anderen Tag ist. Da wäre es also gut, auch das passende Datum anzugeben.
Bei den Sekunden reicht es ja, :00 hinten anzuhängen, aber wie?

habe es jetzt auch nochmal direkt als userreading probiert,
so geht es bei mir.

out:.* {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("timeest","zeit","2019-07-19 17:52:39"))-360))}

entspricht deinem ersten versuch , ausser das bei dir die regex vomuserreading fehlt

out:.*

funktioniert aber auch so

out {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("timeest","zeit","2019-07-19 17:52:39"))-60))}

insofern kann es ggf sein , das mit deinem reading was nicht stimmt ("myMower","next_start_time","00:00") und er auf den ersatzwert 00:00 zurückgreift - dann geht es nämlich in die hose .
ggf. grodd/kleinschreibung oder so ?

gruss Byte09