hilfegesuch für ein perl-problem

Begonnen von the ratman, 19 April 2016, 08:25:23

Vorheriges Thema - Nächstes Thema

ernst1024

Zitat von: the ratman am 19 April 2016, 17:58:01
nach meinem rumgerühre fehlt mir noch mehr der plan als vorher *g* wenn das überhaupt noch möglich ist.

kenn ich :-). Fhem ist schon ziemlich komplex, aber dafür halt auch enorm flexiel.
Gruß Ernst

the ratman

stimm ich dir 100% zu. zumindest kann man sagen: wer fhem verwendet, der brauchts auch unbedingt, oder ist n ausgemachter masochist *lach* bin mir nur noch nicht sicher, was auf mich zutrifft ...
→do↑p!dnʇs↓shit←

the ratman

wollte nur mal nen zwischenbericht geben - ich habs so weit, dass ich werte kriege (glaub ich zumindest)
--> "Regenmenge pro Tag 0.295000000000002"
der rest is halt noch leer weils nicht regenen mag und ich nicht so einfach an die station komme. bis zum füllen des log muß ich also wohl bis zum nächsten regen warten ...
und ich versprech auch def0 nicht mehr readings mit attr zu verwechseln im eifer des gefechts - itüperl-reiter ...
→do↑p!dnʇs↓shit←

the ratman

#18
so, neuigkeiten - oder auch nicht *g*

ich komm leider nicht mal dazu, mysql zu probieren, weil mir das ganze konstrukt nicht mal ins textfile schreiben will ...
da ich immer noch kein perl kann, steh ich also total an.

ich geh davon aus, dass das myDiff irgendwo nicht 100% richtig rennt.
die "RegenmengeTag" wir sowieso richtig weiter gegeben, und die 3 dummys für 1,3 und 24 stunden kriegen permanent "0" in den state geschrieben - alles ohne fehler im logfile.
verbose52016.04.23 19:23:22 5: Triggering RegenmengeNotify
2016.04.23 19:23:22 4: RegenmengeNotify exec {
  my $menge = (ReadingsVal("Wetterstation", "rain", 0) - ReadingsVal("RegenmengeOffset", "state", 0));;
  my $last1hours = myDiff("3600", "Wetterlog", "10:::");;
  my $last3hours = myDiff("10800", "Wetterlog", "10:::");;
  my $last24hours = myDiff("86400", "Wetterlog", "10:::");;
  fhem("set RegenmengeTag $menge");;
  fhem("set RegenmengeLast1Hours $last1hours");;
  fhem("set RegenmengeLast3Hours $last3hours");;
  fhem("set RegenmengeLast24Hours $last24hours");;
}
2016.04.23 19:28:23 4: Wetterlog get: Input file ./log/Wetterstation.log, from:2016-04-23_18:28:23  to:2016-04-23_19:28:23
2016.04.23 19:28:23 4: Wetterlog get: line 1, regexp:, col:9, output lines:0
2016.04.23 19:28:23 4: Wetterlog get: Input file ./log/Wetterstation.log, from:2016-04-23_16:28:23  to:2016-04-23_19:28:23
2016.04.23 19:28:23 4: Wetterlog get: line 1, regexp:, col:9, output lines:0
2016.04.23 19:28:23 4: Wetterlog get: Input file ./log/Wetterstation.log, from:2016-04-22_19:28:23  to:2016-04-23_19:28:23
2016.04.23 19:28:23 4: Wetterlog get: line 1, regexp:, col:9, output lines:0
2016.04.23 19:28:23 4: dummy set RegenmengeTag 1.18
2016.04.23 19:28:23 4: dummy set RegenmengeLast3Hours 0


hier nochmal die vermuteten übeltäter (spart dir das zusammensuchen *g*):
RegenmengeNotify Wetterstation:rain.* {
  my $menge = (ReadingsVal("Wetterstation", "rain", 0) - ReadingsVal("RegenmengeOffset", "state", 0));
  my $last1hours = myDiff("3600", "Wetterlog", "10:::");
  my $last3hours = myDiff("10800", "Wetterlog", "10:::");
  my $last24hours = myDiff("86400", "Wetterlog", "10:::");
  fhem("set RegenmengeTag $menge");
  fhem("set RegenmengeLast1Hours $last1hours");
  fhem("set RegenmengeLast3Hours $last3hours");
  fhem("set RegenmengeLast24Hours $last24hours");
}
und das myDiff# myDiff
# berechnet die Differenz aus der ersten Zeile eines LogFiles und der letzten Zeile eines LogFiles über einen Zeitraum zwischen einem Zeitpunkt in der Vergangenheit und dem Zeitpunkt des Aufrufs
sub
myDiff($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
$attr{global}{verbose} = $oll;
my ($cnt, $first, $last, $diff) = (0)x4;
foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
    if ($cnt == 1) {
     $first = $line[1];
    }
   $last = $line[1];
  }
}
$diff = $last - $first;
Log 4, ("myDiff: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, First: $first, Last: $last, Diff: $diff");
return $diff;
}
alles von http://www.fhemwiki.de/wiki/HM-WDS100-C6-O_Funk-Kombi-Sensor_OC3#Anwendungsbeispiele zusammengetragen und 1:1 umgesetzt (hoffe ich).

vielleicht fallt ja wem was dazu ein, ich steh mit meinem 1%-wissen mal an.
→do↑p!dnʇs↓shit←

CoolTux

Hänge mal ein Beispiellogfile hier ran. Macht das testen in einer Testumgebung einfacher
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

mehr als da oben kommt nicht im log - das war schon n verbose 5 von allen beteiligten dummys, notyfies, ... . ich hab nur nicht mehr auf die andern 2 dummys gewartet. oder was meinst genau?
→do↑p!dnʇs↓shit←

ernst1024

ich würde zuerst mal  das alles auf zwei notifys  verteilen. Als erstes würde ich dies hier testen (habe jetzt nicht auf Klammern usw geachtet, nur als Idee)

Wetterstation:rain.* {
  my $menge = (ReadingsVal("Wetterstation", "rain", 0) - ReadingsVal("RegenmengeOffset", "state", 0));
  fhem("set RegenmengeTag $menge");
}


und als zweites den Teil der die Funktion myDiff durchläuft.


Wetterstation:rain.* {
   my $last1hours = myDiff("3600", "Wetterlog", "10:::");
  my $last3hours = myDiff("10800", "Wetterlog", "10:::");
  my $last24hours = myDiff("86400", "Wetterlog", "10:::");
   fhem("set RegenmengeLast1Hours $last1hours");
  fhem("set RegenmengeLast3Hours $last3hours");
  fhem("set RegenmengeLast24Hours $last24hours");
}


Dannach bist du schonmal ein kleines Stück schlauer und kannst das Problem weiter eingrenzen.
Gruß Ernst

the ratman

#22
hihi, gute idee, aber kann man warscheinlich sparen, weil
fhem("set RegenmengeTag $menge");
richtig erledigt wird. bitte um ausbesserung, wenn du den split aus anderen gründen wolltest.

aktuelles verhalten:
a) die 2 dummys "RegenmengeOffset" und "RegenmengeTag" werden gefüllt.wetterstation rain =  41.3
regenmenge offset = 40.12
regenmengeTag = 1.18
b) es fehlen die 3 berechneten dummy-werte. wobei die auch nicht wirklich zu fehlen scheinen - es wird scheints nur immer "0" geschrieben, so als ob myDiff nichts rechnen würde. z.B. "state   0   2016-04-23 22:58:21" (ich geh anhand des immer wieder aktuellen datums davon aus.)

ich frag mich - vielleicht naiv und dumm - folgendes:
wenn ich aus einem logfile werte rauslesen will um mit denen zu rechnen und im logfile keine werte stehen, womit rechnet das gute ding dann eigentlich seinen durchschnitt aus?
und was würde in dem fall überhaupt in das log geschrieben werden?

nun frag ich mich weiter:
was würde passieren, wenn ich mal 2 gefakte log-zeilen in das file händisch rein schreib?
das dumme: wie müssten die 2 zeilen formatiert sein, damit myDiff damit was anfangen kann?


nachtrag:
wollt nur mal meine "0"-schreibannahme testen und hab den 3 berechneten dummys einfach per set werte zugewiesen - beim nächsten update waren sie wieder auf 0 - die werden also gefüllt - nur faslch
→do↑p!dnʇs↓shit←

CoolTux

Zitat von: the ratman am 23 April 2016, 20:44:39
mehr als da oben kommt nicht im log - das war schon n verbose 5 von allen beteiligten dummys, notyfies, ... . ich hab nur nicht mehr auf die andern 2 dummys gewartet. oder was meinst genau?
Ich meinte das Logfile was eingelesen werden soll, das mit den Daten der Wetterstation Du Nase   ;D


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

#24
das is leicht *g*




is nämlich immer noch leer. war aber mal voller, weil ich testweise andere daten reingeschrieben hab um zu sehen, ob eh alle rechte passen usw.
wenn ich jetzt fies wär, würd ich ja ähnliches schreiben wie: "hast du meine beirträge nicht gelesen?" *sfg*. weil das hat ich ein paar mal schon gesagt *duck und weg*
→do↑p!dnʇs↓shit←

CoolTux

Ich verstehe das nicht. Wie soll er dann die Differenz berechnen wenn das Logfile aus das er die Daten holen soll leer ist? Dann kann das ganze doch gar nicht gehen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

das frag ich mich ja eben auch ... aber gucks dir an, das steht im fhem wiki als abschreibübung drinnen. da stellt doch sicher keiner schrott rein, der nicht funzt, oder?

ausserdem frag ich ja auch, ob mir wer sagen kann, wie wohl so ne zeile im log aussehen müsste. dann mal schnell selber was reinschreiben und hoffen ... aja, und dann endlich das eigentliche problem angehen: das ganze auf mysql umbauen.
→do↑p!dnʇs↓shit←

ernst1024

okay, das Problem ist also nicht das Regenmengen Notify sondern: es loggt nicht, korräääkt?

Ich nehme mal an Wetterstation ist das device und rain ist ein reading? Vielleicht solltest du einmal ein "list Wetterstation" oben in die Kommandozeile eingeben und die Ausgabe hier posten. Dazu vielleicht noch die Definition des Logfiles und damit könnte man dann der Sache auf den Grund gehen.
Gruß Ernst

the ratman

gern

der list (der korrÄÄÄÄckt arbeitenden station *g*)Internals:
   DEF        3747B2
   HMlan_MSGCNT 1
   HMlan_RAWMSG E3747B2,0000,2CDF5D70,FF,FFCB,6E86703747B2000000002D450090C0430A1910
   HMlan_RSSI -53
   HMlan_TIME 2016-04-25 08:51:57
   IODev      HMlan
   LASTInputDev HMlan
   MSGCNT     1
   NAME       Wetterstation
   NR         544
   NTFY_ORDER 50-Wetterstation
   STATE      <table> <tr align="left"><td>Temperatur</td><td>4.5 °C</td></tr> <tr align="left"><td>Taupunkt</td><td>-0.5 °C</td></tr> <tr align="left"><td>Luftfeuchte</td><td>69 %</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Helligkeit</td><td>16</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Windgeschwindigkeit</td><td>6.7 km/h</td></tr> <tr align="left"><td>Windrichtung</td><td>50 °</td></tr> <tr align="left"><td>Windrichtung schwankung</td><td>67.5 °</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Regen</td><td>0</td></tr></table>
   TYPE       CUL_HM
   lastMsg    No:6E - t:70 s:3747B2 d:000000 002D450090C0430A1910
   protLastRcv 2016-04-25 08:51:57
   rssi_at_HMlan min:-53 avg:-53 max:-53 cnt:1 lst:-53
   Helper:
     Dblog:
       Brightness:
         Logdb:
           TIME       1461567117.54143
           VALUE      16
       Dewpoint:
         Logdb:
           TIME       1461567117.54143
           VALUE      -0.7
       Humidity:
         Logdb:
           TIME       1461567117.54143
           VALUE      69
       Israining:
         Logdb:
           TIME       1461567117.54143
           VALUE      0
       Rain:
         Logdb:
           TIME       1461567117.54143
           VALUE      42.48
       Sunshine:
         Logdb:
           TIME       1461567117.54143
           VALUE      25
       Temperature:
         Logdb:
           TIME       1461567117.54143
           VALUE      4.5
       Winddirrange:
         Logdb:
           TIME       1461567117.54143
           VALUE      67.5
       Winddirection:
         Logdb:
           TIME       1461567117.54143
           VALUE      50
       Windspeed:
         Logdb:
           TIME       1461567117.54143
           VALUE      6.7
   Readings:
     2016-04-25 08:51:25   Activity        alive
     2016-04-16 17:26:11   CommandAccepted yes
     2016-04-16 14:57:05   D-firmware      1.4
     2016-04-16 14:57:05   D-serialNr      MEQ0211454
     2016-04-16 14:58:10   PairedTo        0x322433
     2016-04-16 14:58:10   R-burstRx       off
     2016-04-16 14:58:10   R-pairCentral   0x322433
     2016-04-16 14:58:11   R-sunThresh     30
     2016-04-16 14:58:10   RegL_00.        01:00 02:01 05:00 0A:32 0B:24 0C:33 00:00
     2016-04-16 14:58:11   RegL_01.        05:1E 00:00
     2016-04-25 08:51:57   brightness      16
     2016-04-25 08:51:57   dewpoint        -0.7
     2016-04-25 08:51:57   humidity        69
     2016-04-25 08:51:57   isRaining       0
     2016-04-16 20:55:38   luminance       0
     2016-04-25 08:51:57   rain            42.48
     2016-04-25 08:51:57   state           T: 4.5 H: 69 W: 6.7 R: 42.48 IR: 0 WD: 50 WDR: 67.5 S: 25 B: 16
     2016-04-25 08:51:57   sunshine        25
     2016-04-25 08:51:57   temperature     4.5
     2016-04-25 08:51:57   windDirRange    67.5
     2016-04-25 08:51:57   windDirection   50
     2016-04-25 08:51:57   windSpeed       6.7
   Helper:
     HM_CMDNR   110
     mId        0040
     rxType     12
     Expert:
       def        1
       det        0
       raw        1
       tpl        0
     Io:
       newChn     +3747B2,00,00,00
       nextSend   1461567117.52662
       prefIO
       rxt        0
       vccu
       p:
         3747B2
         00
         00
         00
     Mrssi:
       mNo        6E
       Io:
         HMlan      -51
     Prt:
       bErr       0
       sProc      0
     Q:
       qReqConf
       qReqStat
     Role:
       chn        1
       dev        1
     Rssi:
       At_hmlan:
         avg        -53
         cnt        1
         lst        -53
         max        -53
         min        -53
Attributes:
   IODev      HMlan
   actCycle   000:10
   actStatus  alive
   autoReadReg 4_reqStatus
   expert     2_raw
   firmware   1.4
   icon       humidity
   model      HM-WDS100-C6-O
   peerIDs    00000000,
   room       HMlan,Terrasse
   serialNr   MEQ0211454
   stateFormat <table> <tr align="left"><td>Temperatur</td><td>temperature °C</td></tr> <tr align="left"><td>Taupunkt</td><td>dewpoint °C</td></tr> <tr align="left"><td>Luftfeuchte</td><td>humidity %</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Helligkeit</td><td>brightness</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Windgeschwindigkeit</td><td>windSpeed km/h</td></tr> <tr align="left"><td>Windrichtung</td><td>windDirection °</td></tr> <tr align="left"><td>Windrichtung schwankung</td><td>windDirRange °</td></tr> <tr align="left"><td></td><td></td></tr> <tr align="left"><td>Regen</td><td>isRaining</td></tr></table>
   subType    THSensor

und hier des logfiles (der rest rennt ja auf mysql):Internals:
   DEF        ./log/Wetterstation.log RegenmengeLast1Hours:state:.*|RegenmengeLast24Hours:state:.*|RegenmengeLast3Hours:state:.*|RegenmengeOffset:state:.*|RegenmengeTag:state:.*
   NAME       Wetterlog
   NR         564
   NTFY_ORDER 50-Wetterlog
   REGEXP     RegenmengeLast1Hours:state:.*|RegenmengeLast24Hours:state:.*|RegenmengeLast3Hours:state:.*|RegenmengeOffset:state:.*|RegenmengeTag:state:.*
   STATE      active
   TYPE       FileLog
   currentlogfile ./log/Wetterstation.log
   logfile    ./log/Wetterstation.log
   Pos:
Attributes:
   group      WetterstationUmrechnung
   room       Szenen
→do↑p!dnʇs↓shit←

ernst1024

hmnn, also erstmal, ich bin ja auch Suchender und in deinem Fall einfach mal ins Wasser gesprungen und stelle jetzt fest das Wasser ist kalt :-)
Zu spät.

OK, also vielleicht bin ich ja total auf der falschen Spur, aber sehe ich das richtig das du Daten loggen willst die du erst aufgrund der Daten im Logfile berechnen willst. Die Daten, die als Grundlage für die Berechnung (myDiff) dienen, werden aber so wie ich das sehe gar nicht geloggt? 

./log/Wetterstation.log RegenmengeLast1Hours:state:.*|RegenmengeLast24Hours:state:.*|RegenmengeLast3Hours:state:.*|RegenmengeOffset:state:.*|RegenmengeTag:state:.*

also müsste da nicht stehen Wetterstation:rain:.*|temperature:.*  usw?

Auch würde ich erstmal die ganzen fancy Formatierungen in der cfg mit '#' auskommentieren. Das versperrt mir jedenfalls immer den Blick auf's wesentliche. Sorry wenn ich keine Lösung anbieten kann, ich kann nur sagen wie ich es angehen würde.
Gruß Ernst