gelöst: split erzeugt Fehlermeldung

Begonnen von aficianado, 04 November 2016, 13:21:01

Vorheriges Thema - Nächstes Thema

aficianado

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
RaPi3, esp8266, LoRa, Tasmota

DeeSPe

Ich denke Du verwendest split falsch!

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

aficianado

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ß
RaPi3, esp8266, LoRa, Tasmota

DeeSPe

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
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

aficianado

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ß

RaPi3, esp8266, LoRa, Tasmota

DeeSPe

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
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

aficianado

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ß
RaPi3, esp8266, LoRa, Tasmota

dev0

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.

aficianado

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

RaPi3, esp8266, LoRa, Tasmota

aficianado

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]);;\
}


RaPi3, esp8266, LoRa, Tasmota

DeeSPe

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
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

aficianado

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 !
RaPi3, esp8266, LoRa, Tasmota

DeeSPe

Dann zeig doch mal den kompletten Code wenn man Dir helfen soll....
Mit diesen Bruchstücken kommen wir nicht weiter...


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

aficianado


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ß
RaPi3, esp8266, LoRa, Tasmota

DeeSPe

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
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