"Zeichnen" mit xy Koordinaten

Begonnen von bgewehr, 20 September 2015, 13:12:57

Vorheriges Thema - Nächstes Thema

bgewehr

#15
Also analog:

#logProxy Polar::[map{ReadingsVal($_,"temperature",0)}devspec2array("MAX.*")]


dann so:

#lp Func:logProxy_xy2Plot([map{ReadingsVal($_,"Cartesian",0)}devspec2array("RPiMower_listen")])

??


{ReadingsVal("RPiMower_listen","Cartesian",0)}


ergibt jedenfalls


[[-112, 23], [-113, 19], [-117, 16], [-114, 11], [-114, 7], [-114, 3], [-116, 0], [-159, -6], [-198, -14], [-124, -13], [-223, -32], [-196, -35], [-129, -28], [-107, -27], [-106, -31], [-194, -63], [-119, -44], [-124, -51], [-116, -52], [-90, -44], [-88, -47], [-83, -48], [-82, -51], [-79, -54], [-77, -56], [-76, -59], [-73, -61], [-74, -67], [-69, -66], [-68, -71], [-66, -73], [-64, -76], [-61, -78], [-58, -79], [-55, -82], [-53, -85], [-41, -71], [-39, -72], [-35, -72], [-34, -75], [-30, -73], [-25, -69], [-22, -68], [-20, -69], [-18, -70], [-17, -76], [-14, -75], [-11, -77], [-9, -82], [-7, -91], [-4, -94], [0, -96], [1, -37], [6, -95], [3, -38], [13, -93], [12, -73], [8, -39], [9, -39], [27, -98], [32, -99], [14, -41], [16, -41], [41, -94], [43, -90], [46, -88], [48, -85], [51, -83], [54, -81], [56, -79], [59, -77], [62, -75], [65, -73], [68, -71], [70, -69], [72, -66], [76, -65], [78, -62], [80, -59], [79, -54], [81, -51], [85, -50], [87, -47], [94, -46], [100, -45], [102, -42], [102, -38], [112, -37], [113, -33], [113, -29], [85, -19], [82, -15], [81, -12], [77, -9], [77, -6], [76, -3], [79, 0], [76, 2], [76, 5], [77, 8], [77, 10], [76, 13], [77, 16], [76, 19], [75, 21], [75, 24], [74, 27], [73, 29], [72, 32], [72, 35], [28, 15], [28, 16], [27, 17], [27, 18], [26, 19], [25, 20], [25, 20], [63, 56], [24, 24], [23, 24], [22, 25], [22, 26], [21, 26], [20, 28], [113, 167], [107, 171], [21, 37], [20, 37], [18, 38], [37, 84], [34, 85], [31, 87], [28, 88], [58, 205], [51, 207], [44, 209], [7, 44], [6, 44], [4, 44], [3, 45], [1, 45], [0, 100], [-4, 100], [-7, 100], [-12, 107], [-14, 99], [-18, 98], [-21, 98], [-24, 95], [-28, 94], [-31, 93], [-33, 90], [-36, 88], [-38, 84], [-41, 83], [-44, 82], [-47, 80], [-50, 79], [-53, 77], [-56, 75], [-60, 76], [-63, 74], [-63, 69], [-65, 67], [-70, 67], [-73, 64], [-75, 62], [-84, 65], [-83, 60], [-85, 57], [-87, 54], [-89, 50], [-86, 45], [-89, 43], [-90, 40], [-91, 36], [-92, 33], [-93, 30], [-95, 27], [-99, 24]]


Da sind aber auf jeden Fall Leerzeichen drin...

Ich muss wohl doch ne Funktion machen, oder?

EDIT:


#lp Func:logProxy_xy2Plot({my $tmp=ReadingsVal("RPiMower_listen","Cartesian",0);;$tmp=~ s/\ //g;;$tmp})


geht leider auch nicht... wegen der Leerzeichen warscheinlich.

EDIT2:


define strConvert notify RPiMower_listen:Cartesian:.* {
my $tmp=ReadingsVal("RPiMower_listen","Cartesian",0);;
$tmp=~ s/\ //g;;
fhem("SetReading RPiMower_listen Cartesian1 $tmp");;
}


das macht jetzt ein Reading ohne Leerzeichen.

Ich bekomme aber dennoch die "Daten" nicht in die Funktion, weil es ja nach wie vor ein String ist, oder?


#lp Func:logProxy_xy2Plot([map{ReadingsVal("RPiMower_listen","Cartesian1",0)}])


tut es jedenfalls nicht, nicht mit und nicht ohne map.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Prof. Dr. Peter Henning

Das mit den Leerzeichen bezieht sich auf die Codezeile, nicht auf den String - und gilt in der Form nur, weil das innerhalb eines Parameters für logProxy steht.

Es wäre deshalb wirklich sinnvoll, eine eigene Funktion zu definieren. Denn es müssen mit dem regulären Ausdruck auch die Klammern herausgenommen werden, und dann mit dem Perl-Kommando split() der String in ein Array umgewandelt werden.

Betreffend das Gerät: Ich tippe mal, dass das große Problem die Wiederkehrgenauigkeit sein wird. Sprich: es wird sich selber an den gleichen physischen Positionen unterschiedliche interne Koordinatenwerte zuweisen.

LG

pah

bgewehr

Hallo, Peter,

eine Funktion also, die eine Objektreferenz liefert.

Nun muss ich ja ein Objekt Array von Koordinatenpaaren haben. Kann ich bitte ein bisschen Perl bekommen, um den Weg zu finden?

Wiederkehrgenauigkeit ist nicht gegeben, bisher weiß er nicht mal irgendwelche Koordinaten. Er fährt rum u d weicht Hindernissen aus.

Was ich jetzt versuche ist ein kleiner Trick zum Aufsuchen der Ladestation.

Dazu soll die Umgebung gescannt werden, dann ein geeigneter Weg zum Westzaun gefahren werden, an dem es dann nordwärts zur Station führt.

Induktionsschleifen möchte ich vermeiden, das hat ja jeder...

Gruß Bernd
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

Das hier klingt auch hilfreich, geht aber nicht im notify, weil da immer noch @ durch den Devicenamen ersetzt wird....

http://stackoverflow.com/questions/8608627/perl-initializing-an-object-from-a-string
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

marvin78

Das geht schon, man muss es nur maskieren. Oder eben den featurelevel in FHEM entsprechend setzen. Dann wird @ nicht mehr durch den Devicenamen ersetzt. Die Funktion ist ja schon lange deprecated.

justme1968

leerzeichen dürfen in der columnspec zeile im plotfile nicht auftauchen. im array ist es egal. aber da können eigentlich keine auftauchen. es ist ja ein numerisches array.

du brauchst etwas in der art:use strict;
use warnings;

sub
reading2ArrayRef()
{
  my @a = ();

  my ($x,$y) = split( ',', ReadingsVal(...) );

  push @a, [$x,$y];

  return \@a;
}


wenn beide coordinaten in deinem reading stecken musst du zuerst mal splitten um x und y zu bekommen. sonst steckst du nur wieder einen string in dein array. es müssen aber jeweils koordinatenpaare sein.

alternativ zum manuellen splitten und zusammenbauen kannst du das reading mit einem string im passenden format auch per eval in ein entsprechendes perl array konvertieren.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

bgewehr

#21
Wenn der Dumper ein sauberes Objekt zeigt, ist dann der Job gemacht?


{Dumper getObjectFromReading("RPiMower_listen","Cartesian1")}



sub getObjectFromReading($$) {
       my ($device, $reading) = @_;

       #my @a = ();

       #my ($x,$y) = split( ',', ReadingsVal($device, $reading, 0) );
       #push @a, [$x,$y];

       #return \@a;
       my @object1 = eval(ReadingsVal($device, $reading, 0));
       return \@object1;
}


Habe das Gefühl, dass ich nun ein sauberes Objekt liefere, bekomme aber kein Chart...


# Created by FHEM/98_SVG.pm, 2015-09-21 20:53:26
set terminal png transparent crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'RPiMower WORLD'
set ytics
set y2tics
set grid
set ylabel "Süd - Nord"
set y2label ""
set xrange [-200:200]
set yrange [-200:200]

#lp Func:logProxy_xy2Plot({getObjectFromReading("RPiMower_listen","Cartesian1")})
#lp Func:logProxy_xy2Plot([[0,0]])

plot "<IN>" using 1:2 axes x1y1 title 'WORLD' ls l1fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'RPiMower' ls l0 lw 1 with points
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

eigentlich sollte es genau so gehen.

ich schaue es mir an.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

#23
eval liefert schon eine referenz zurück die kannst du direkt verwenden. also so:

sub getArrayRefFromReading($$) {
       my ($device, $reading) = @_;

       my $points = eval(ReadingsVal($device, $reading, 0));

       return $points;
}


und im plot file musst du die {} weg lassen da sowieso der ganze string durch ein eval geschickt wird:#lp Func:logProxy_xy2Plot(getArrayRefFromReading("RPiMower_listen","Cartesian1"))

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

frank

cooles spielzeug!
wie sieht denn dazu die rasenflaeche aus?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

bgewehr

Wie schon gesagt, geometrisch einfach. Ist ein Rechteck mit einem Ausschnitt in Form eines Viertelkreises, an drei Seiten durch Zaun begrenzt, an einer durch abfallende Böschung.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968