Dummy mit FileRead aus txt-File füttern

Begonnen von maddinthebrain, 14 November 2017, 13:10:44

Vorheriges Thema - Nächstes Thema

maddinthebrain

Hallo zusammen,

ich versuche Werte einer Wettersoftware die auf dem gleichen Raspi läuft wie der Fhem-Server in Fhem zu bekommen. Nach einiger Recherche scheint der Weg per Dummy und userreadings mit dem Befehl FileRead die richtige Wahl zu sein.

Die Datei selbst besteht aus 14.02.17 13:02:44 6,8 68 1,3 1,0 1,4 157 0,0 0,3 1028,9 SSE 1 m/s C mb mm 19,9 -0,2 37,5 166,5 3,0 23,4 44 6,8 +1,9 8,4 12:38 -2,7 02:06 2,4 11:14 2,7 11:10 1029,5 09:40 1024,9 00:02 3.0.0 3043 1,4 6,8 5,0 0,0 0,00 0 191 0,0 8 1 0 S 2249 ft 4,3 0,0 280 0.0
Die Zahlenwerte stehen in einer Zeile und sind durch Leerzeichen getrennt. Nun wüsste ich gerne, wie ich die Werte sinnvoll einlese. Der Weg wie in https://forum.fhem.de/index.php/topic,64627.msg680050.html#msg680050 führt mit attr WetterVAL userReadings WetterwerteEchtzeit { my @content = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; return $content[-1]}
nicht zum Ziel. Ich nehme an da ist noch der Fehlerteufel drin.

Die einzelnen Werte sind wie folgt definiert:

<#date format=dd/mm/yy> <#timehhmmss> <#temp> <#hum> <#dew> <#wspeed> <#wlatest> <#bearing> <#rrate> <#rfall> <#press> <#currentwdir> <#beaufortnumber> <#windunit> <#tempunitnodeg> <#pressunit> <#rainunit> <#windrun> <#presstrendval> <#rmonth> <#ryear> <#rfallY> <#intemp> <#inhum> <#wchill> <#temptrend> <#tempTH> <#TtempTH> <#tempTL> <#TtempTL> <#windTM> <#TwindTM> <#wgustTM> <#TwgustTM> <#pressTH> <#TpressTH> <#pressTL> <#TpressTL> <#version> <#build> <#wgust> <#heatindex> <#humidex> <#UV> <#ET> <#SolarRad> <#avgbearing> <#rhour> <#forecastnumber> <#isdaylight> <#SensorContactLost> <#wdir> <#cloudbasevalue> <#cloudbaseunit> <#apptemp> <#SunshineHours> <#CurrentSolarMax> <#IsSunny>

Wie kann ich das Reading am sinnvollsten definieren?

Vielen Dank

Grüße Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

dev0

ZitatWie kann ich das Reading am sinnvollsten definieren?
Wäre es nicht sinnvoll, ein wenig Perl zu lernen und die fast fertige Lösung selbst entsprechend anzupassen? FHEM ist nun mal ein Framework...

maddinthebrain

Wäre es nicht sinnvoll, ein wenig Perl zu lernen und die fast fertige Lösung selbst entsprechend anzupassen? FHEM ist nun mal ein Framework...

Ja, ... Könntest du mir was dazu empfehlen? Website, Tutorial...? So von wegen Syntax usw.

Und zum Thema "fast fertig": Was fehlt denn? Ich völliger Neuling in Perl. Daher ja auch die Frage in den Anfängerfragen...

Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

dev0

ZitatKönntest du mir was dazu empfehlen? Website, Tutorial...?
Das sind die Geschmäcker sehr unterschiedlich. Ein wenig Recherche im Netz wird Dir tausende brauchbare Ergebisse liefern.

Mir hat das bisher gereicht:
https://web.archive.org/web/20161226115243/wiki.selfhtml.org/wiki/Perl/
http://perldoc.perl.org/


DeeSPe

Wäre es nicht sinnvoller ein zyklisches at statt userReadings zu verwenden?
Es gibt doch kein Event welches WetterVAL dazu anregen könnte userReadings zu erstellen.
Dann würde ich den String zerlegen und die jeweiligen Werte in dazu passende Readings schreiben.

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

Thorsten Pferdekaemper

Hi,
ich würde an Deiner Stelle erst einmal versuchen, den ganzen Dateiinhalt an ein Reading zu hängen. Dann weißt Du, dass das Einlesen im Prinzip klappt. Danach sehen wir weiter.
Also in etwa:
attr WetterVAL userReadings WetterwerteEchtzeit { my ($error, @content) = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; return join(" / ", @content)}
Den Rückgabewert der FileRead Funktion habe ich angepasst, damit es hierzu passt: https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileRead.

...und DeeSPe hat natürlich Recht. Du must das ganze auch noch getriggert bekommen. Testweise kannst Du das aber auch mit "set WetterVal on" machen.

Gruß,
   Thorsten
FUIP

maddinthebrain

Super das Einlesen klappt, auch schon einmal pro Minute. Jetzt fehlt nur noch das Aufsplitten.

Grüße Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DeeSPe

Zitat von: maddinthebrain am 14 November 2017, 19:15:15
Super das Einlesen klappt, auch schon einmal pro Minute. Jetzt fehlt nur noch das Aufsplitten.

Na bitte, das Aufsplitten ist ja nur Fleißarbeit... ;)

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

Thorsten Pferdekaemper

Zitat von: maddinthebrain am 14 November 2017, 19:15:15
Super das Einlesen klappt, auch schon einmal pro Minute. Jetzt fehlt nur noch das Aufsplitten.
Zeigst Du mal ein "list" von dem Teil?
Gruß,
    Thorsten
FUIP

maddinthebrain

Here we go:

Internals:
   CFGFN
   NAME       WetterWH1080
   NR         3124
   STATE      on
   TYPE       dummy
   Helper:
     DBLOG:
       WetterEchtzeit:
         logmysql:
           TIME       1510687155.0985
           VALUE      14.19.17 20:19:14 2,6 82 -0,2 1,0 1,4 135 0,0 0,3 1030,9 SE 1 m/s C mb mm 42,1 0,5 37,5 166,5 3,0 23,5 45 2,6 -0,1 8,4 12:38 -2,7 02:06 2,4 11:14 3,4 16:56 1030,9 20:17 1024,9 00:02 3.0.0 3043 2,0 2,6 0,4 0,0 0,00 0 126 0,0 1 0 0 SE 1131 ft -0,1 0,0 0 0
       state:
         logmysql:
           TIME       1510687155.0985
           VALUE      on
   READINGS:
     2017-11-14 20:19:15   WetterEchtzeit  14.19.17 20:19:14 2,6 82 -0,2 1,0 1,4 135 0,0 0,3 1030,9 SE 1 m/s C mb mm 42,1 0,5 37,5 166,5 3,0 23,5 45 2,6 -0,1 8,4 12:38 -2,7 02:06 2,4 11:14 3,4 16:56 1030,9 20:17 1024,9 00:02 3.0.0 3043 2,0 2,6 0,4 0,0 0,00 0 126 0,0 1 0 0 SE 1131 ft -0,1 0,0 0 0
     2017-11-14 20:19:15   state           on
Attributes:
   room       Wetter
   userReadings WetterEchtzeit { my ($error,  @content)  = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; return join(" / ", @content) }
   verbose    3


Bei der Zeit ist noch ein Bug. Aber das kommt vom CumulusMX, soll hier aber nicht stören.
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

Thorsten Pferdekaemper

Hi,

userReadings WetterDate { my ($error,  @content)  = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; my @readings = split(' ', $content[0]);; return $readings[0] }

Das müsste sich jetzt das Datum herauspicken.
Mit Datum und Zeit wäre das in etwa so:

userReadings WetterDate { my ($error,  @content)  = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; my @readings = split(' ', $content[0]);; return $readings[0] }, WetterZeit { my ($error,  @content)  = FileRead({FileName => "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file"});; my @readings = split(' ', $content[0]);; return $readings[1] } 

Das ganze wird also schnell etwas unhandlich. Wahrscheinlich wäre das eine kleine Routine in der 99_myUtils.pm sinnvoller, die z.B. per at einmal pro Minute aufgerufen wird.
Gruß,
   Thorsten
FUIP

DeeSPe

#11
Ich würde immer noch ein at nehmen. ;)

Etwa so:
defmod at_WetterWH1080_set at +*00:01 {\
  my ($error,@content) = FileRead("/home/pi/CumulusMX/data/realtime/realtimeval.txt");;\
  return $error if ($error);;\
  my $dev = "WetterWH1080";;\
  my @read = split " ",$content[0];;\
  fhem "setreading $dev date $read[0]";;\
  fhem "setreading $dev time $read[1]";;\
  fhem "setreading $dev temperature $read[2]";;\
  fhem "setreading $dev humidity $read[3]";;\
  fhem "setreading $dev dewpoint $read[4]";;\
  fhem "setreading $dev windspeed $read[5]";;\
  fhem "setreading $dev wlatest $read[6]";;\
  fhem "setreading $dev bearing $read[7]";;\
  fhem "setreading $dev rrate $read[8]";;\
  fhem "setreading $dev rfall $read[9]";;\
  fhem "setreading $dev pressure $read[10]";;\
  fhem "setreading $dev winddir $read[11]";;\
  fhem "setreading $dev beaufortnumber $read[12]";;\
}


Die setreading müssen natürlich noch weiter geführt werden für die restlichen Werte (Fleißarbeit).

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

maddinthebrain

Ok super. So was in der Art hatte ich schon im Auge. Ist halt etwas Fleißarbeit. Interessant ist aber auch die Variante über myutils. Mal sehen, ich werde berichten.

Vielen Dank bis dahin!  :)
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

maddinthebrain

Eine Frage hätte ich noch, ich werde nicht alle Einträge brauchen, z.B. die Einheiten. Da lasse ich einfach das Feld aus, oder? Die Felder werden doch in der eckigen Klammer adressiert, richtig?

Viele Grüße

Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

DeeSPe

Zitat von: maddinthebrain am 15 November 2017, 06:43:40
Ok super. So was in der Art hatte ich schon im Auge. Ist halt etwas Fleißarbeit. Interessant ist aber auch die Variante über myutils. Mal sehen, ich werde berichten.

Vielen Dank bis dahin!  :)

Du kannst den Code genauso auch in eine Funktion in der 99_myUtils schreiben und dann die Funktion im at aufrufen.
Wie Du möchtest.

Zitat von: maddinthebrain am 15 November 2017, 08:43:42
Eine Frage hätte ich noch, ich werde nicht alle Einträge brauchen, z.B. die Einheiten. Da lasse ich einfach das Feld aus, oder? Die Felder werden doch in der eckigen Klammer adressiert, richtig?

So ist es.

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