Dummy mit FileRead aus txt-File füttern

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

Vorheriges Thema - Nächstes Thema

maddinthebrain

Es gibt noch ein kleines Problem: Das Reading enthält als Dezimaltrenner das Komma (,). Fhem braucht aber doch den Punkt (.). Ich hätte das mit einem RegExp gemacht. z.B. so
$val =~ s/,/\./; $val;

das kann man doch sicher elegant in das Splitting mit aufnehmen.

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

maddinthebrain

Hallo zusammen,
Mein erster Versuch schaut so aus:

WetterEchtzeit {
my ($error,@content) = FileRead({FileName=> "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file" });;
return $error if ($error);;
my $dev = "WetterWH1080";;
my @read = split " ",$content[0];;
#
$read[5] =~ s/,/\./; $read[5];
fhem "setreading $dev wind $read[5]";;
#return $read[5];;
}


Leider kackt Fhem darüber ab, die Logdatei wächst in rasender Geschwindigkeit. Endlosschleife ? Das setreading habe ich im Verdacht. Wenn ich über das return was zurück gebe, funktioniert das. Das Wetterechtzeit wird über eine at Funkton getriggert. Das Listing dazu
Internals:
   COMMAND    set WetterWH1080 on
   DEF        +*00:01:00 set WetterWH1080 on
   NAME       WetterRead
   NR         76
   NTM        22:51:09
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      inactive
   TIMESPEC   00:01:00
   TRIGGERTIME 1510955469.37713
   TRIGGERTIME_FMT 2017-11-17 22:51:09
   TYPE       at
   READINGS:
     2017-11-17 22:50:09   state           inactive
Attributes:


Was passt da nicht? Ist es die Art, wie ich mit set on aufrufe?

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

Du hast für das userReading keinen Trigger angegeben und somit triggert es auf alles (auch auf sich selbst).
Damit hast Du eine schöne Rekursion gebaut.

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,
lass das userReading ganz weg und rufe das Coding aus dem at heraus auf.
Gruß,
   Thorsten
FUIP

maddinthebrain

Ok. So dachte ich schon. Nun möchte ich das wie schon vorgeschlagen in die 99myUtils stecken. Ich hätte dazu
WetterEchtzeit { 
my ($error,@content) = FileRead({FileName=> "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file" });; 
return $error if ($error);; 
my $dev = "WetterWH1080";;
my @read = split " ",$content[0];;
$read[5] =~ s/,/\./; $read[5];
fhem "setreading $dev wind $read[5]";;
#return $read[5];; 
}


Dorthin verschoben. Im WetterWH1080 das userreading gelöscht.
Aufruf in der At wäre dann wie richtig? So
WetterEchtzeit()?

Ich versuche parallel auch perl zu verstehen. Ein bisschen was geht schon, nur sind mir manche Besonderheiten im Zusammenhang mit Fhem noch nicht ganz klar.

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

Thorsten Pferdekaemper

Hi,
ja, genau. Das Coding in die 99_myUtils.pm packen und die doppelten Semikola (Semikolons?) wegmachen. Hier sollten es einzelne sein.

Zitat von: maddinthebrain am 18 November 2017, 08:05:53

$read[5] =~ s/,/\./; $read[5];
In der obigen Zeile macht das "$read[5];" am Ende gar nichts. Das würde ich wegmachen.

Zitat
Aufruf in der At wäre dann wie richtig?
Nein, Du musst nach Perl wechseln mit {}, also etwa

{WetterEchtzeit()}

Gruß,
   Thorsten
FUIP

maddinthebrain

Super, es klappt!  ;D Dankeschön! War ich ja gar so weit vom Ziel weg.  :P

Schönes Wochenende

Ich werde das bei Gelegenheit noch mal hier schön dokumentieren. Und auch ins Wiki tun.

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

maddinthebrain

#22
Hallo zusammen,

Ein Problem gibts doch noch. Die Readings werden nach dem Speichern der 99myUtil.pm genau einmal gesetzt. Danach bleiben die Werte stehen. Beim Speichern von der myutils kommt eine Fehlermeldung
Can't call method "WetterEchtzeit" on an undefined value at ./FHEM/99_myUtils.pm line 21.

Die Datei selber sieht so aus

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z 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;
use POSIX;

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

# Enter you functions below _this_ line.

WetterEchtzeit { 
my ($error,@content) = FileRead({FileName=> "/home/pi/CumulusMX/data/realtime/realtimeval.txt", ForceType => "file" });
return $error if ($error);
my $dev = "WetterWH1080";
my @read = split " ",$content[0];
$read[2] =~ s/,/\./;
fhem "setreading $dev temperature $read[2]";
$read[3] =~ s/,/\./;
fhem "setreading $dev humidity $read[3]";
$read[5] =~ s/,/\./;
fhem "setreading $dev wind $read[5]";
$read[6] =~ s/,/\./;
fhem "setreading $dev windgust $read[6]";
}


Das List vom Dummy so
Internals:
   CFGFN
   NAME       WetterWH1080
   NR         963
   STATE      ???
   TYPE       dummy
   Helper:
     DBLOG:
       humidity:
         logmysql:
           TIME       1511026359.33647
           VALUE      64
       temperature:
         logmysql:
           TIME       1511026359.28601
           VALUE      4.8
       wind:
         logmysql:
           TIME       1511026359.38474
           VALUE      1.4
       windgust:
         logmysql:
           TIME       1511026359.43855
           VALUE      2.4
   READINGS:
     2017-11-18 18:32:39   humidity        64
     2017-11-18 18:32:39   temperature     4.8
     2017-11-18 18:32:39   wind            1.4
     2017-11-18 18:32:39   windgust        2.4
Attributes:


Das At so Internals:
   COMMAND    {WetterEchtzeit()}
   DEF        +*00:01:00 {WetterEchtzeit()}
   NAME       WetterRead
   NR         76
   NTM        18:43:18
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 18:43:18
   TIMESPEC   00:01:00
   TRIGGERTIME 1511026998.85024
   TRIGGERTIME_FMT 2017-11-18 18:43:18
   TYPE       at
   Helper:
     DBLOG:
       state:
         logmysql:
           TIME       1511026938.86464
           VALUE      Next
   READINGS:
     2017-11-18 18:42:18   state           Next: 18:43:18
Attributes:
   icon       weather_station_quadra
   room       Wetter


Wenn ich {WetterEchtzeit()} in die Fhem-Befehlszeile eintippe und ausführe kommt
Undefined subroutine &main::WetterEchtzeit called at (eval 6917) line 1.

Ich finde den Fehler nicht...

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

Funktionen fangen immer mit sub an.

Also statt:
WetterEchtzeit {
so:
sub WetterEchtzeit {

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

Hmm genau das mit der richtigem Funktionsdefinition hatte nicht gefunden.

Es geht. Super.

Schönen Abend und Dankeschön

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

ixsus300

Hallo,

habe ein ähnliches Problem. Es funktioniert zwar aus dem LogFile auszulesen und als Reading zu setzen, nur wird immer die 1. Zeile des LogFiles ausgelesen.
Ich benötige aber die letzte Zeile. Hatte schon es mit "tail -n 1"  versucht, scheitert wohl an der syntax.

define LogWertEinlesen at +*00:15 {my ($error,@content) = FileRead("/opt/fhem/log/MyLog.log") ; return $error if ($error) ; my $dev = "MyDev" ; my @read = split " ",$content[0] ; fhem "setreading $dev state $read[3]"}

wäre für jeden Tipp dankbar

Wzut

#26
dann nimm nicht $content[0]  , d.h. das erste Element aus @content sondern einfach das letzte :)
$ich_bin_das_letzte = pop(@content);
oder gruselig:
$content[$content-1]
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

betateilchen

Zitat von: ixsus300 am 23 Oktober 2020, 17:19:07
nur wird immer die 1. Zeile des LogFiles ausgelesen.

Die Behauptung ist Quatsch. Gelesen wird sehr wohl das ganze File, aber Du verwendest nur die erste Zeile.

Fehlende perl Grundlagen, insbesondere beim Thema "array". Hat nix mit FHEM zu tun.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ixsus300

Danke an Wzut, nun funktioniert es.

@betateilchen: ich habe nichts behauptet sondern eben einen Fehler in meinem code vermutet.
Klar ist es für einen Profi leicht ersichtlich und ja ist perl, aber denke das Forum ist auch für Hilfestellungen da. Du supportest gut, nur finde ich man darf es nicht immer nur aus seiner eigenen Sicht sehen.

Danke nochmal 😁