gelöst: split erzeugt Fehlermeldung

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

Vorheriges Thema - Nächstes Thema

aficianado

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!


RaPi3, esp8266, LoRa, Tasmota

CoolTux

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

aficianado

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

RaPi3, esp8266, LoRa, Tasmota

CoolTux

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

aficianado

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

CoolTux

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.....";
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

aficianado

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

RaPi3, esp8266, LoRa, Tasmota

CoolTux

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

aficianado

Danke für die Tipps, ich werde mich damit beschäftigen.

Viele Grüße
RaPi3, esp8266, LoRa, Tasmota