Autor Thema: Reading auftrennen und verarbeiten  (Gelesen 2865 mal)

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Reading auftrennen und verarbeiten
« am: 19 Juli 2019, 13:49:05 »
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

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4385
  • Wer anderen eine Bratwurst brät...
    • Buy me a coffee
Antw:Reading auftrennen und verarbeiten
« Antwort #1 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
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

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #2 am: 19 Juli 2019, 15:17:42 »
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?

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #3 am: 19 Juli 2019, 15:25:19 »
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".

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #4 am: 19 Juli 2019, 16:07:04 »
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

  • Gast
Antw:Reading auftrennen und verarbeiten
« Antwort #5 am: 19 Juli 2019, 16:20:32 »
edit beitrag gelöscht : den letzten post nicht richtig gelesen

gruss Byte09

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15800
Antw:Reading auftrennen und verarbeiten
« Antwort #6 am: 19 Juli 2019, 16:43:53 »
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.
« Letzte Änderung: 19 Juli 2019, 16:50:15 von Beta-User »
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19528
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Reading auftrennen und verarbeiten
« Antwort #7 am: 19 Juli 2019, 16:46:31 »
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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Byte09

  • Gast
Antw:Reading auftrennen und verarbeiten
« Antwort #8 am: 19 Juli 2019, 16:48:48 »
..
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

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #9 am: 19 Juli 2019, 17:07:38 »
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?

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19528
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Reading auftrennen und verarbeiten
« Antwort #10 am: 19 Juli 2019, 17:23:12 »

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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #11 am: 19 Juli 2019, 17:29:36 »
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.
« Letzte Änderung: 19 Juli 2019, 17:35:20 von jfi1310 »

Byte09

  • Gast
Antw:Reading auftrennen und verarbeiten
« Antwort #12 am: 19 Juli 2019, 17:43:04 »
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 ;-)

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

gruss Byte09
« Letzte Änderung: 19 Juli 2019, 17:45:39 von Byte09 »

Offline jfi1310

  • New Member
  • *
  • Beiträge: 16
Antw:Reading auftrennen und verarbeiten
« Antwort #13 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?

Byte09

  • Gast
Antw:Reading auftrennen und verarbeiten
« Antwort #14 am: 19 Juli 2019, 18:03:08 »
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
« Letzte Änderung: 19 Juli 2019, 18:19:04 von Byte09 »

 

decade-submarginal