FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: aficianado am 04 November 2016, 13:21:01

Titel: gelöst: split erzeugt Fehlermeldung
Beitrag von: aficianado am 04 November 2016, 13:21:01
Hallo Miteinander,

mit FHEM bekomme ich  über Telnet Sensordaten als dummy, das funktioniert soweit prima. Jetzt habe ich aber einen csv dummy, den ich teilen möchte mit split in der fhem.cfg:

define DG_S_00 dummy
attr DG_S_00 room Alarmanlage
define DG_S_t dummy
attr DG_S_t room Alarmanlage
define act_DG_S_00 notify DG_S_00 {\
  my $st= Value("DG_S_00");;\
  my $st1= "1,2,3,4,5,"."$st";;\
  my @sta= split /,/, $st1;;\
  fhem ("set DG_S_t ".$st1);;\
  }

Im Alarmroom bekomme ich dann folgende Ausgabe:
Zitat
DG_S_002016.11.04_11:33:34
DG_S_t 1,2,3,4,5,2016.11.04_11:16:42
und im Log:
Zitat
2016.11.04 11:31:19 3: act_DG_S_00 return value: No such class DG_S_00sta at (eval 1173) line 4, near ";
  my DG_S_00sta"
syntax error at (eval 1173) line 4, near "my DG_S_00sta="
deshalb wird DS_S_t nicht mehr aktualisiert. Lösche ich die Zeile mit split, wird DS_S_t aktualisiert. Also stimmt was nicht mit der Zeile split. Aber diese arbeitet in einem anderen notify im gleichen fhem.cfg einwandfrei, dort wird eine eingelesene Webseite zerteilt. Jetzt dachte ich, vielleicht gibt ja Value("DG_S_00") nicht einen String zurück, deshalb habe ich diesen mit  "1,2,3,4,5,"."$st" sicherheitshalber in Hochkomma als String eingelesen, das ändert aber leider nicht die Unverträglichkeit mit dem split?

Bin für jeden Hinweis dankbar,

viele Grüße
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 04 November 2016, 16:43:50
Ich denke Du verwendest split falsch!

Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 04 November 2016, 17:35:52
Danke für den Tip, ich habe noch mal recherchiert und nach Google müsste
my @sta=split(/,/,$st1);

funktionieren, tut es aber nicht, dazu die Fehlermeldung aus dem Log:
2016.11.04 17:27:04 3: act_DG_S_00 return value: Unknown command {, try help.
Unknown command my, try help.
Unknown command my, try help.

irgendwie sehe ich den Fehler nicht, da ein paar notify weiter oben in meinem fhem.cfg folgendes einwandfrei funktioniert:
  my $st= GetFileFromURL("http://192.168.1.18/csv.htm",2);;\
  my @sta= split /,/, $st;;\

Wo bitte könnte der Fehler liegen?

Danke + Gruß
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 04 November 2016, 17:42:45
Ich mache split so:
my @sta = split(",",$st1);

Aber wofür soll das gut sein?
@sta wird hier gar nicht weiter verarbeitet!

Zitatmy $st1= "1,2,3,4,5,"."$st";
Das würde ich auch besser so schreiben:
my $st1= "1,2,3,4,5,$st";

Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 04 November 2016, 17:58:17
danke erst mal für die Antwort!
@sta will ich später weiter verarbeiten, wenn das split funktioniert. Ich habe das jetzt so geändert:

define act_DG_S_00 notify DG_S_00 {\
  my $st= Value("DG_S_00");;\
  my @sta = split("_",$st);;\
  my $st1= $sta[1];;\
  fhem ("set DG_S_t ".$st1);;\
  }

room Alarmanlage zeigt jetzt in DG_D_t den alten Wert, weil split so bei mir leider nicht funktioniert:
DG_S_00 2016.11.04_17:52:58
DG_S_t 1,2,3,4,5,2016.11.04_17:46:53

erwartet hätte ich:
DG_S_t 17:52:58
ist aber leider nicht...

und Log zeigt die Fehlermeldung:
2016.11.04 17:54:09 3: act_DG_S_00 return value: No such class DG_S_00sta at (eval 141576) line 3, near ";
  my DG_S_00sta"
syntax error at (eval 141576) line 3, near "my DG_S_00sta ="
Global symbol "@sta" requires explicit package name at (eval 141576) line 4.

Irgendwie seh ich den Wald vor lauter Bäumen nicht, oder?

Danke + Gruß

Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 04 November 2016, 18:05:38
Fangen wir doch mal von Anfang an!
Was soll denn eigentlich passieren??
Und wie willst Du bei DG_S_t irgendwas per set setzen wenn es gar keine setList hat?

ZitatDG_S_t 1,2,3,4,5,2016.11.04_17:46:53
Was soll das werden?

Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 04 November 2016, 18:33:42
per Telnet wird in FHEM der dummy DG_S_00 beschrieben mit einem String mit Delemiter.
Diesen String möchte ich nun aufsplitten und die einzelnen Fragmente neuen dummy Variablen zuweisen als String. In meinem Beispiel sollte in DG_S_t einfach nur die Uhrzeit stehen.

Wenn das mal funktioniert, wird DG_S_00 einen echten csv-String mit Delemiter "," erhalten und mit z.B. 30 Elementen, die Zählstände und Temperaturen als String enthalten und die ich in andere dummy-Variablen schreibe.

Das mit dem SetList kann bei mir eigentlich nicht das Problem sein, da in einem notify weiter oben in meiner fhem.cfg folgendes ohne SetList klaglos ausgeführt wird:
  my $st= GetFileFromURL("http://192.168.1.18/csv.htm",2);;\
  my @sta= split /,/, $st;;\
  if (defined $sta[29]){\
    my $v= "Li".$sta[26]."% ".$sta[29]."Wh";;\
    fhem ("set GAR_li zu ".$v);;}\

was dazu dient, dass der dummy GAR_li in einem floorplan dargestellt wird mit dem Value "zu Li75% 1244Wh", was bedeutet:
Garagentor ist zu, drinnen brennt Licht mit 75% und der Stromverbrauch ist gerade 1244Wh.

Wenn das bisher so schön seit Monaten funktioniert, frage ich mich, warum das nicht funktioniert:
define act_DG_S_00 notify DG_S_00 {\
  my $st= Value("DG_S_00");;\
  my @sta = split("_",$st);;\
  my $st1= $sta[1];;\
  fhem ("set DG_S_t ".$st1);;\
  }

Ich verstehe jedenfalls den Unterschied nicht, aber an irgend etwas muss es ja liegen...
Im funktionierenden Part kommt der String über GetFileFromURL, im nichtfunktionierenden per Telnet. Aber beide werden als String verarbeitet und einem dummy zugeordnet und können auch so ausgegegben werden in einem room, nur beim nichtfunktionierenden ohne split - aber wieso??

Danke und Gruß
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: dev0 am 05 November 2016, 08:46:24
Zitat von: aficianado am 04 November 2016, 18:33:42
aber wieso??
Bau in das Script Log oder print statements ein und schau Dir so die einzelnen Elemente an.
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 05 November 2016, 12:23:17
ok, habe ich gemacht. Script:
define act_DG_S_00 notify DG_S_00 {\
  my $st= Value("DG_S_00");;\
  fhem ("set DG_S_t $st");;\
  fhem ("set DG_S_log $st");;\
  }
room Alarmanlage:
DG_S_00   2016.11.05_12:10:15
DG_S_t      2016.11.05_12:10:15

Logfile DG_S_log:
2016-11-05_12:10:13 DG_S_log 2016.11.05_12:10:13
2016-11-05_12:10:14 DG_S_log 2016.11.05_12:10:14
2016-11-05_12:10:15 DG_S_log 2016.11.05_12:10:15
2016-11-05_12:10:16 DG_S_log 2016.11.05_12:10:16

Jede Zeile im Logfile wird mit einem 0x0A abgeschlossen, andere "unsichtbare" Zeichen sind nicht enthalten.

und füge ich in das Script ein:
  my @sta = split("_",$st);;\
dann steht wieder DG_S_t

was läuft falsch?

Gibt es denn in FHEM die Möglichkeit eines udp-binding? Dann könnte ich so die Zeilen ins FHEM bringen und das mit dem Telnet sparen. Ich hatte schon mal nach udp-binding eingehend gesucht aber damals nichts brauchbares gefunden.

Danke für Deine/Eure Hilfe

Titel: Antw:split erzeugt Fehlermeldung requires explicit package
Beitrag von: aficianado am 07 November 2016, 11:53:15
Hallo Miteinander,

split funktioniert bei zeitgesteuerten Aufrufen mit at und der gleiche Programmcode funktioniert nicht in einem notify und das Log gibt dazu folgende Fehlermeldung:
2016.11.07 11:45:51 3: act_DG_S_001 return value: No such class DG_S_00sta at (eval 314629) line 6, near ";
  my DG_S_00sta"
syntax error at (eval 314629) line 6, near "my DG_S_00sta="
Global symbol "@sta" requires explicit package name at (eval 314629) line 7.

Weiß jemand welches Package benötigt wird und wie man dies einbindet?

Bin für jeden Hinweis dankbar !


define DG_S_t1 dummy
attr DG_S_t1 room Alarmanlage
define DG_S_t1z dummy
define act_DG_S_000 at +*00:00:03 {\
  my $z= Value("DG_S_t1z");;\
  $z= $z+1;;\
  fhem ("set DG_S_t1z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t1 ".$sta[3]);;\
}
define DG_S_t2 dummy
attr DG_S_t2 room Alarmanlage
define DG_S_t2z dummy
define act_DG_S_001 notify DG_S_00 {\
  my $z= Value("DG_S_t2z");;\
  $z= $z+1;;\
  fhem ("set DG_S_t2z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t2 ".$sta[3]);;\
}


Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 07 November 2016, 12:15:05
Ich verstehe Dein Problem nicht!!!
Die Fehlermeldung sagt:
Zitatsyntax error at (eval 314629) line 6, near "my DG_S_00sta="
Global symbol "@sta" requires explicit package name at (eval 314629) line 7.

"my DG_S_00" kommt aber in Deinem geposteten Code gar nicht vor!!!
Wenn das so wäre, wäre die Variablenzuweisung falsch da ein $ vor dem Variablennamen fehlt.

Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 07 November 2016, 13:54:58
define DG_S_00 dummy ist weiter oben im Code, sorry, ist nur nicht dargestellt.

Leider wird split immer noch nicht im zweiten Teil ausgeführt. DG_S_00 ändert sich im Abstand von 2-3s, entsprechend kommt auch immer die Fehlermeldung im LOG. Schmeiße ich die split-Zeile raus, kommt keine Fehlermeldung und der Code wird abgearbeitet. Stelle ich das split wieder ein, wird der Code nicht mehr abgearbeitet, das ist mein Problem...

Danke für die Hilfe !
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 07 November 2016, 14:03:01
Dann zeig doch mal den kompletten Code wenn man Dir helfen soll....
Mit diesen Bruchstücken kommen wir nicht weiter...


Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 07 November 2016, 14:29:51

define DG_S_00 dummy
attr DG_S_00 room Alarmanlage
define DG_S_t1 dummy
attr DG_S_t1 room Alarmanlage
define DG_S_t1z dummy
define act_DG_S_000 at +*00:00:03 {\
  my $z= Value("DG_S_t1z");;\
  $z= $z+1;;\
  fhem ("set DG_S_t1z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t1 ".$sta[3]);;\
}
define DG_S_t2 dummy
attr DG_S_t2 room Alarmanlage
define DG_S_t2z dummy
define act_DG_S_001 notify DG_S_00 {\
  my $z= Value("DG_S_t2z");;\
  $z= $z+1;;\
  fhem ("set DG_S_t2z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t2 ".$sta[3]);;\
}
define DG_S_t3 dummy
attr DG_S_t3 room Alarmanlage
define act_DG_S_003 at +*00:00:03 {\
  my $st= Value("DG_S_00");;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t3 ".$sta[0]);;\
}


DG_S_00 wird alle 2-3s über Telnet gesetzt und ändert sich fortlaufend.
Im room Alarmanlage zählt DG_S_t1 hoch, DG_S_t2 steht bei ??? und DG_S_t3 zeigt fortlaufend den Inhalt von DG_S_00. Mein Ziel ist DG_S_t2 zum Laufen zu bringen unter Anwendung von split. DG_S_t1 und DG_S_t3 dienen nur zu meiner Verdeutlichung des Problems in DG_S_t2.

Danke + Gruß
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: DeeSPe am 07 November 2016, 15:10:36
Ich steige da nicht durch was Du probierst!
Das notify soll durch den dummy DG_S_00 getriggert werden, dabei aber Werte von DG_S_t2z verarbeiten?

Und warum um Himmels Willen so viele dummy(s)? Da kann man doch irgendwann nicht mehr durchsehen!
Evtl. solltest Du das dummy Chaos sein lassen und dich mal mit "setreading" und "ReadingsVal" beschäftigen. Denn wenn es nicht unbedingt im state stehen muss, dann sind die ganzen dummy(s) sinnlos, da du auch alle selbst erstellten Readings in ein Device schreiben kannst.

Gruß
Dan
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 07 November 2016, 18:23:50
danke für Deine mail.
Das mit den Dummy lässt sich natürlich reduzieren:

define DG_S_00 dummy
attr DG_S_00 room Alarmanlage
define DG_S_t2 dummy
attr DG_S_t2 room Alarmanlage
define DG_S_t2z dummy
define act_DG_S_001 notify DG_S_00 {\
  my $z= Value("DG_S_t2z");;\
  $z= $z+1;;\
  fhem ("set DG_S_t2z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t2 ".$sta[3]);;\
}

Damit der lokale Zähler $z seinen Wert behält mache ich ihn mit dummy global/static, vielleicht gibt es ja da einen elganteren Weg.

Und  DG_S_00 wird über Telnet an fhem übertragen und der Value steht dann im dummy. Ich habe keine andere Möglichkeit gefunden Telnet-Variablen ins fhem zu bekommen. Weiß vielleicht jemand wie man es besser macht?

Anstatt Telnet könnte ich auch die Daten per udp an fhem senden, aber leider ist es mir nicht gelungen, ein 24/7 funktionierendes udp-binding zu finden. Kennt jemand vielleicht eines?

Das praktische an Telnet und dummy ist das notify, weil damit die Werte automatisch aktualisiert werden. Alternativ könnte ich meine Sensordaten auch aus Textfiles lesen. Geht das irgendwie elegant?

Danke für eure Geduld und Zeit!


Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: CoolTux am 07 November 2016, 19:15:32
Wenn Du per telnet das STATE eines Dummys mit einem Wert belegen kannst, kannst du auch readings setzen in einem passenden Device.

set Dummy bla

Ware dann

setreading Device readingname value


Das ist besser als viele dummys
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 08 November 2016, 13:06:48
Hallo CoolTux,
erst mal Danke für Deine Antwort.
in Telnet verwende ich folgende Zeile:
setreading DG_S_00 state 2016.11.07_22:24:54
wobei dieser Zeitstempel später durch einen csv-String ersetzt werden soll mit vielen Sensorwerten, aber das Thema split im notify wurde ja bereits beschrieben.
Ich verstehe das so, dass das Device mit dem Namen DG_S_00 mit dem state beschrieben wird, das klappt, sofern das Device auch in fhem bekannt ist und das habe ich mit:
define DG_S_00 dummy
gemacht, also Device dummy. Aber welches Device könnte ich alternativ verwenden? Ich habe in Verbindung mit Telnet immer nur dummy gesehen. Das FHEM läuft bei mir auf einem abgesetzten RaPi, da ist außer WLAN nichts dran.

Und gibt es eine Möglichkeit das lokale $z irgendwie anders statisch zu machen als mit einem neuen dummy?
Wenn ich in der at-Funktion das statische perl-state verwende:
define act_DG_S_000 at +*00:00:03 {\
  state $z;;\
  if ($z) {$z++;;}\
  else    {$z= 0;;}\
  fhem ("set DG_S_t1z $z");;\
  my $st= "1,2,3,".$z;;\
  my @sta= split /,/, $st;;\
  fhem ("set DG_S_t1 ".$sta[3]);;\
}
bekomme ich im Log:
2016.11.08 13:04:03 3: act_DG_S_000: Global symbol "$z" requires explicit package name at (eval 906969) line 2.
Global symbol "$z" requires explicit package name at (eval 906969) line 3.

funktioniert so also nicht.


Danke vielmals im Voraus für Deine Hilfe

Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: CoolTux am 08 November 2016, 13:16:24
Bau Dir einen allgemeinen Dummy für DG_S irgendwas Teile. Und nehme dann nicht state als Reading sondern den Namen des DG_S was weiß ich. So hast Du am Ende eine liste aller DG_S Teile als Reading im Dummy Device.

Keine Ahnung was state $z sein soll. Aber mach einfach ein my $z; und dann ist das schick.
Eventuell ist es eine gute Idee einfach über telnet eine 99_myUtils-Funktion auf zu rufen welche dann erstmal Deine ganzen splits und haste nicht gesehen macht und dann das fertige Ergebnis in ein Reading des Dummys schreibt.

Gib mal so ein Beispiel csv String von Dir. Dann kann man mal schauen.
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 08 November 2016, 14:39:29
danke, das hört sich gut an, der Telnet-Befehl lautet:
setreading DG_S state 2016.11.08_14:30:30,0068,0068,0,3780,2890014B467FFF031057

die letzten Bytes sind von einem 1w-Sensor, 9001 entspricht 0x0190 = 400dez entspricht 400/16=25°C

Wie bekomme ich das nun bitte in eine sub in der 99_Utils.pm?

Danke + Gruß
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: CoolTux am 08 November 2016, 14:46:05
In dem Du nicht setreading auf rufst sondern die sub die Du erstellst.
Ich muß gestehen ich habe das noch nicht gemacht, ob es geht werden wir dann testen. Weißt Du wie Du eine sub erstellst?
Statt der

setreading DG_S state 2016.11.08_14:30:30,0068,0068,0,3780,2890014B467FFF031057

machst Du dann

{ subname("2016.11.08_14:30:30,0068,0068,0,3780,2890014B467FFF031057") }

Damit bekomtm Deine Sub schon mal den Wert welchen Du ja weiter verarbeiten willst.
Nun kannst Du die für Dich wichtigen Teile zerlegen. Das geht definitiv mit split


sub meineSub($) {
      my ($value) = @_;

     my @datas = split(',', $value);
     my $datum = $datas[0];
     ....
     ....
}


Und so weiter und so weiter.
Verstehst Du was ich meine?

Und am Ende wenn Du dann alles zusammen hast machst Du ein fhem "setreading.....";
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 08 November 2016, 17:30:11
Danke, das klappt super gut!  Das split funktioniert in der sub wie es soll und die Werte kommen auch alle dort an. Ich habe damit wieder ein set auf einzelne dummy gemacht, das geht wie gewohnt.

Du hast an dieser Stelle setreading erwähnt, was hätte das für Vorteile zu set und wie könnte das ausschauen?

Danke für Deine Hilfe und viele Grüße

Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: CoolTux am 08 November 2016, 17:40:46
Vorteil würde ich es nun nicht nennen. Ich weiß nicht wie Du die Werte weiter bearbeitest, aber wenn du nun einen Dummy hast und nur ein set machst hast du quasi ja auch nur ein Reading.
Ich persönlich würde der Übersicht halber ein einzigen Dummy nehmen und dort ein Reading mit Readingwert pro Sensor machen. Aber wie gesagt kommt drauf an was du damit noch machen willst.
Du kannst ganz einfach ein

fhem "setreading DEVICENAME READINGNAME VALUE" machen.
Oder du schaust Dir mal readingsBeginUpdate und readingsBulkUpdate und readingsEndUpdate an. Fi fest du im Wiki im Developerbereich.
Deinen Hash vom Device bekommst mit einen

$hash = $defs{DUMMYNAME};



Grüße
Titel: Antw:split erzeugt Fehlermeldung
Beitrag von: aficianado am 08 November 2016, 17:44:37
Danke für die Tipps, ich werde mich damit beschäftigen.

Viele Grüße