Zitat
Daher habe ich in der ambi-config alle Gamma Werte auf 2.0 gesetzt und dank Volle´s Script folgende Werte in der main.c eingetragen:
Bright: 1.0
Red: 0.96
Green: 0.24
Blue: 0.3
Wo und wie kann ich diese Werte ändern?
Zitat
Daher habe ich in der ambi-config alle Gamma Werte auf 2.0 gesetzt und dank Volle´s Script folgende Werte in der main.c eingetragen:
Bright: 1.0
Red: 0.96
Green: 0.24
Blue: 0.3
Wo und wie kann ich diese Werte ändern?
farbwerte ambi-tv? Schau mal ob du hier fündig wirst!
Das steht in Beitrag #2.
Das versprochene Video....
Nochmals danke an alle beteiligten.
[youtube]6o1uQalm87Y[/youtube]
Alles anzeigen
das Problem hat glaub ich jeder der mit ambi-tv arbeitet und das ist auch einer der größten Kritikpunkte an ambi-tv.ich hatte das Problem auch und hab mir folgendermaßen beholfen:
https://forum-raspberrypi.de/www.activehitz…olle/ambitv.zip
lad die zip datei herunter und ersetze mit den 2 .c Dateien die bei dir schon vorhandenen Dateien.
kompilier dann mit make ambi-tv neu.achtung: bei mir waren die (ich weiß nicht mehr genau welche) grün und blau Kanäle vertauscht, falls das bei dir nicht der fall sein sollte dann musst du das in der lpdxxx.c Datei zurückändern (wie/wo findest du hier im Forum).
nachdem du kompiliert hast kannst du die einzelnen Farb Kanäle in der Konsole "abschwächen":
mit 1 bzw. 4 veränderst du den Multiplikator für den Rot Kanal
mit 2 bzw. 5 veränderst du den Multiplikator für den Grün Kanal
mit 3 bzw. 6 veränderst du den Multiplikator für den Blau Kanal
mit b bzw. d veränderst du die Helligkeit.die Werte sind standardmäßig so eingestellt wie sie für mich optimal waren, du musst hier wahrscheinlich noch ein wenig rumspielen.
Wenn du optimale Werte gefunden hast notier sie dir und veränder die default Werte in der main.c (ist ziemlich weit unten in der Funktion main() )
danach nochmal neu kompilieren und neu starten.So wird es zwar nicht perfekt aber ich bin sehr zufrieden damit.
Gruß
Chris
Ich hab mir am Wochenende auch ambi-TV zusammegebaut und es läuft auch soweit mit LPD 8806. Jedoch bin ich auch mit den Farben noch nicht wirklich zufrieden...
Da ich aber absoluter neuling in solchen Dingen bin, versteh ich deine Anleitung nicht ganz!
1. Wo genau muss ich die beiden Dateien austauschen? Hab über WinSCP schon alles durchsucht, aber entweder bin ich blind, oder ich finde sie nicht...
2. Wie genau funktioniert das dann mit der Konsole?
Hoffe, du bist noch aktiv und liest das...
Vielen Dank!
Grüße Matte
Zu Frage 1: Steht in Post #29 ff.
1. Wo genau muss ich die beiden Dateien austauschen? Hab über WinSCP schon alles durchsucht, aber entweder bin ich blind, oder ich finde sie nicht...
2. Wie genau funktioniert das dann mit der Konsole?
also zu Frage 1:
die datei main.c liegt in~/ambi-tv-master/src
die datei lpdxxxxx.c liegt in ~/ambi-tv-master/src/components
das ist jetzt nur aus dem Kopf, ich bin mir nich 100%ig sicher
zu 2:
wenn du ambitv startest dann hast du ja eine ausgabe in der Konsole (welche funktion gerade aktiv ist...)
wenn du hier die tasten drückst dann bekommst du eine Rückmeldung wie die aktuellen Einstellungen lauten.
Wenn du alles so eingestellt hast wie es dir gefällt dann schreibst du dir die werte auf und editierst in der main.c ziemlich weit unten (kenne die Zeile gerade nicht) die voreingestellten werte. Das sollte mit ein bisschen nachsehen zu bewerkstelligen sein.
gruß
Chris
Das ging ja Fix! Vielen Dank!
Werde ich heute abend gleich mal ausprobieren!
Grüße
Das versprochene Video....
Nochmals danke an alle beteiligten.
[youtube]6o1uQalm87Y[/youtube]
Hi
Wo finde ich denn dieses Testvideo?
Danke!
Ja, du hast vermutlich die lpd*.o Datei vor dem Kompilieren nicht gelöscht. Das musst Du tun.
gilt das nur für die lpd*.o datei oder muss die main.o auch gelöscht werden damit alle Änderungen übernommen werden ?
hey würde vorschlagen hier mal nen paar setups zu posten von den farbwerten
meine cfg
v4l2-grab-source {
name v4l2-video
video-device /dev/video0
buffers 4
crop-left 5
crop-top 5
crop-right 5
crop-bottom 20
autocrop-luminance-threshold 25
}
timer-source {
name timer-30fps
millis 33
}
lpd8806-spidev-sink {
name led-frame
spi-device /dev/spidev0.0
spi-speed-hz 2500000
leds-top 54-87 # left-to-right
leds-bottom 33-0 # left-to-right
leds-left 53-34 # top-to-bottom
leds-right 88-107 # top-to-bottom
led-inset-top 3
led-inset-bottom 3.8
led-inset-left 3
led-inset-right 3.5
blended-frames 6
gamma-red 1.0
gamma-green 1.0
gamma-blue 1.0
}
Alles anzeigen
was ich bisher in dem thread gelesen habe und getestet:
Bright.: 1.000000 R: 0.960000 G: 0.240000 B:0.290000
Dies war die letzte hier gepostete Einstellung
---> Geht zur Stark ins Rote weiß wirkt Pinkt -> unbrauchbar
Ich selbst habe mit diesen werten angefangen
Bright.: 1.000000 R: 0.480000 G: 0.460000 B:0.470000
Bright.: 1.000000 R: 0.640000 G: 0.560000 B:0.490000
Bright.: 1.000000 R: 0.860000 G: 0.420000 B:0.350000
Bright.: 1.000000 R: 0.640000 G: 0.660000 B:0.410000
Die letzten Zeilen habe ich jetzt so compiled.
Bin sehr zufrieden nochmal danke an volle
mfg
wuschel
Gute Idee
config
v4l2-grab-source {
name v4l2-video
video-device /dev/video0
buffers 4
crop-left 20
crop-top 20
crop-right 20
crop-bottom 20
autocrop-luminance-threshold 25
}
timer-source {
name timer-30fps
millis 33
}
lpd8806-spidev-sink {
name led-frame
spi-device /dev/spidev0.0
spi-speed-hz 2500000
leds-top 24-65 # left-to-right
leds-bottom 131-90 # left-to-right
leds-left 23-0 # top-to-bottom
leds-right 65-89 # top-to-bottom
led-inset-top 2.7
led-inset-bottom 2.3
led-inset-left 2.3
led-inset-right 2.3
blended-frames 6
gamma-red 2.0
gamma-green 2.0
gamma-blue 2.0
Alles anzeigen
Brightness:1.0
R = 0.78
G = 0.36
B = 0.45
so gefällt es mir im Moment am besten
mfg ra77
Hallo,
auch ich habe Änderungswünsche an meinen Farben.
Rot ist manchmal zu rosalastig (das hält sich aber noch in Grenzen)
Weis hat nen blaustich (das kenne ich immer so von led ... ist ein weises weis überhaupt machbar?)
Gelb hat einen Grünstich.
-Was müsste ich hier verändern?
Grüße
Klaus
Hallo,
wenn ich die Werte in der config ändere, reicht das dann oder muss ich das dann jedesmal neu kompilieren?
Und wenn ja...
Kann mir einer kurz schreiben wie das geht? Ich hab leider keine ahnung davon. Ich geh mit putty auf den Raspberry, ändern tue ich die conig aktuell per FTP halt.
Ohne das ich Ahnung hätte:
Bei Änderungen in der Config Datei reicht neu starten.
Bei Änderungen des Quellcodes musst du mittels "make" neu erstellen.
Was ich nicht ganz versteh ist warum manche die Farbwerte in der main.c ändern und nicht in der ambi-tv.conf ??
Kann ich in beiden die Werte ändern oder sind das verschiedene??
In der main.c kann ich auch noch die brightness einstellen was ich in der ambi-tv.conf nicht kann oder ?
ich habe bisher alles in der ambi-tv.conf geändert weil ich auch nicht ganz weiß wie ich das mit dem Kompilieren machen muss.
Was ich nicht ganz versteh ist warum manche die Farbwerte in der main.c ändern und nicht in der ambi-tv.conf ??
Kann ich in beiden die Werte ändern oder sind das verschiedene??In der main.c kann ich auch noch die brightness einstellen was ich in der ambi-tv.conf nicht kann oder ?
ich habe bisher alles in der ambi-tv.conf geändert weil ich auch nicht ganz weiß wie ich das mit dem Kompilieren machen muss.
Bei mir hat sich nichts verändert als ich die Werte in der ambi-tv.conf geändert hatte. Deshalb habe ich selbst Änderungen an der main.c vorgenommen. Das sind 2 paar Stiefel.
Wenn du was in der main.c änderst dann musst du neu kompilieren, das machst du indem du in den ambi-tv ordner gehst und make eingibst.
komisch ist das ich in meiner main.c diese Gamma Einstellungen gar nicht habe.
Hier meine Main.c
/* ambi-tv: a flexible ambilight clone for embedded linux
* Copyright (C) 2013 Georg Kaindl
*
* This file is part of ambi-tv.
*
* ambi-tv is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* ambi-tv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ambi-tv. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <getopt.h>
#include <sys/time.h>
#include <termios.h>
#include "parse-conf.h"
#include "registrations.h"
#include "program.h"
#include "gpio.h"
#include "util.h"
#include "log.h"
#define LOGNAME "main: "
#define DEFAULT_CONFIG_PATH "/etc/ambi-tv.conf"
#define BUTTON_MILLIS 250
#define BUTTON_MILLIS_HYST 10
struct ambitv_main_conf {
int program_idx;
int gpio_idx;
char* config_path;
int cur_prog, ambitv_on, gpio_fd;
int button_cnt;
struct timeval last_button_press;
volatile int running;
};
static struct ambitv_main_conf conf;
static void
ambitv_signal_handler(int signum)
{
signal(signum, SIG_IGN);
conf.running = 0;
}
static int
ambitv_handle_config_block(const char* name, int argc, char** argv)
{
int ret = 0;
switch(name[0]) {
case '&':
ret = ambitv_register_program_for_name(&name[1], argc, argv);
break;
default:
ret = ambitv_register_component_for_name(name, argc, argv);
break;
}
return ret;
}
static long
ambitv_millis_between(struct timeval* now, struct timeval* earlier)
{
return (long)((now->tv_sec - earlier->tv_sec) * 1000) +
(long)((now->tv_usec - earlier->tv_usec) / 1000);
}
static int
ambitv_cycle_next_program()
{
int ret = 0;
if (!conf.ambitv_on) {
ambitv_log(ambitv_log_info,
LOGNAME "not cycling program, because state is paused.\n");
return 0;
}
conf.cur_prog = (conf.cur_prog + 1) % ambitv_num_programs;
ret = ambitv_program_run(ambitv_programs[conf.cur_prog]);
if (ret < 0) {
ambitv_log(ambitv_log_error, LOGNAME "failed to switch to program '%s', aborting...\n",
ambitv_programs[conf.cur_prog]->name);
} else {
ambitv_log(ambitv_log_info, LOGNAME "switched to program '%s'.\n",
ambitv_programs[conf.cur_prog]->name);
}
return ret;
}
static int
ambitv_toggle_paused()
{
int ret = 0;
conf.ambitv_on = !conf.ambitv_on;
if (conf.ambitv_on) {
ret = ambitv_program_run(ambitv_programs[conf.cur_prog]);
if (ret < 0)
ambitv_log(ambitv_log_error, LOGNAME "failed to start program '%s'.\n",
ambitv_programs[conf.cur_prog]->name);
} else {
ret = ambitv_program_stop_current();
if (ret < 0)
ambitv_log(ambitv_log_error, LOGNAME "failed to stop program '%s'.\n",
ambitv_programs[conf.cur_prog]->name);
}
ambitv_log(ambitv_log_info, LOGNAME "now: %s\n",
conf.ambitv_on ? "running" : "paused");
return ret;
}
static int
ambitv_runloop()
{
int ret = 0;
unsigned char c = 0;
fd_set fds, ex_fds;
struct timeval tv;
FD_ZERO(&fds); FD_ZERO(&ex_fds);
FD_SET(STDIN_FILENO, &fds);
if (conf.gpio_fd >= 0)
FD_SET(conf.gpio_fd, &ex_fds);
tv.tv_sec = 0;
tv.tv_usec = 500000;
ret = select(MAX(STDIN_FILENO, conf.gpio_fd)+1, &fds, NULL, &ex_fds, &tv);
if (ret < 0) {
if (EINTR != errno && EWOULDBLOCK != errno) {
ambitv_log(ambitv_log_error, LOGNAME "error during select(): %d (%s)\n",
errno, strerror(errno));
ret = 0;
}
goto finishLoop;
}
if (FD_ISSET(STDIN_FILENO, &fds)) {
ret = read(STDIN_FILENO, &c, 1);
if (ret < 0) {
if (EINTR != errno && EWOULDBLOCK != errno) {
ambitv_log(ambitv_log_error, LOGNAME "error during read() on stdin: %d (%s)\n",
errno, strerror(errno));
} else
ret = 0;
goto finishLoop;
} else if (0 == ret)
goto finishLoop;
switch (c) {
case 0x20: { // space
ret = ambitv_cycle_next_program();
if (ret < 0)
goto finishLoop;
break;
}
case 't': {
ret = ambitv_toggle_paused();
if (ret < 0)
goto finishLoop;
break;
}
default:
break;
}
}
if (conf.gpio_fd >= 0 && FD_ISSET(conf.gpio_fd, &ex_fds)) {
char buf[16];
ret = read(conf.gpio_fd, buf, sizeof(*buf));
lseek(conf.gpio_fd, 0, SEEK_SET);
if (ret < 0) {
if (EINTR != errno && EWOULDBLOCK != errno) {
ambitv_log(ambitv_log_error, LOGNAME "failed to read from gpio %d.\n",
conf.gpio_idx);
ret = -1;
} else
ret = 0;
goto finishLoop;
} else if (0 == ret)
goto finishLoop;
if ('0' == buf[0]) {
struct timeval now;
(void)gettimeofday(&now, NULL);
if (0 != conf.last_button_press.tv_sec) {
long millis = ambitv_millis_between(&now, &conf.last_button_press);
if (millis <= BUTTON_MILLIS && BUTTON_MILLIS_HYST <= millis)
conf.button_cnt++;
} else
conf.button_cnt++;
memcpy(&conf.last_button_press, &now, sizeof(struct timeval));
}
}
if (conf.button_cnt > 0) {
struct timeval now;
(void)gettimeofday(&now, NULL);
if (0 != conf.last_button_press.tv_sec) {
long millis = ambitv_millis_between(&now, &conf.last_button_press);
if (millis > BUTTON_MILLIS) {
if (conf.button_cnt > 1) {
ret = ambitv_cycle_next_program();
} else {
ret = ambitv_toggle_paused();
}
conf.button_cnt = 0;
memset(&conf.last_button_press, 0, sizeof(struct timeval));
}
}
}
finishLoop:
return ret;
}
static void
ambitv_usage(const char* name)
{
const char* p = name + strlen(name);
while (p != name && *p != '/') p--;
if ('/' == *p) p++;
printf(
"usage: %s [options]\n"
"\n"
"options:\n"
"\t-b/--button-gpio gpio pin to use as physical button. function disabled if i < 0. (default: -1).\n"
"\t-f/--file [path] use the configuration file at [path] (default: %s).\n"
"\t-h,--help display this help text.\n"
"\t-p,--program run the -th program from the configuration file on start-up.\n"
"\n",
p, DEFAULT_CONFIG_PATH
;
}
static int
ambitv_main_configure(int argc, char** argv)
{
int c, ret = 0;
static struct option lopts[] = {
{ "button-gpio", required_argument, 0, 'b' },
{ "file", required_argument, 0, 'f' },
{ "help", no_argument, 0, 'h' },
{ "program", required_argument, 0, 'p' },
{ NULL, 0, 0, 0 }
};
while (1) {
c = getopt_long(argc, argv, "b:f:hp:", lopts, NULL);
if (c < 0)
break;
switch (c) {
case 'f': {
if (NULL != optarg) {
conf.config_path = strdup(optarg);
}
break;
}
case 'b':
case 'p': {
if (NULL != optarg) {
char* eptr = NULL;
long nbuf = strtol(optarg, &eptr, 10);
if ('\0' == *eptr && nbuf > 0) {
if ('b' == c)
conf.gpio_idx = (int)nbuf;
else if ('p' == c)
conf.program_idx = (int)nbuf;
} else {
ambitv_log(ambitv_log_error, LOGNAME "invalid argument for '%s': '%s'.\n",
argv[optind-2], optarg);
ambitv_usage(argv[0]);
return -1;
}
}
break;
}
case 'h': {
ambitv_usage(argv[0]);
exit(0);
}
default:
break;
}
}
if (optind < argc) {
ambitv_log(ambitv_log_error, LOGNAME "extraneous configuration argument: '%s'.\n",
argv[optind]);
ambitv_usage(argv[0]);
ret = -1;
}
return ret;
}
int
main(int argc, char** argv)
{
int ret = 0, i;
struct ambitv_conf_parser* parser;
struct termios tt;
unsigned long tt_orig;
signal(SIGINT, ambitv_signal_handler);
signal(SIGTERM, ambitv_signal_handler);
printf(
"\n"
"*********************************************************\n"
"* ambi-tv: diy ambient lighting for your screen or tv *\n"
"* (c) @gkaindl *\n"
"*********************************************************\n"
"\n"
;
conf.program_idx = 0;
conf.gpio_idx = -1;
conf.config_path = DEFAULT_CONFIG_PATH;
conf.ambitv_on = 1;
conf.gpio_fd = -1;
conf.running = 1;
ret = ambitv_main_configure(argc, argv);
if (ret < 0)
return -1;
parser = ambitv_conf_parser_create();
parser->f_handle_block = ambitv_handle_config_block;
ret = ambitv_conf_parser_read_config_file(parser, conf.config_path);
ambitv_conf_parser_free(parser);
if (ret < 0) {
ambitv_log(ambitv_log_error, LOGNAME "failed to parse configuration file, aborting...\n");
ambitv_usage(argv[0]);
return -1;
}
if (ambitv_num_programs <= 0) {
ambitv_log(ambitv_log_error, LOGNAME "no programs available, aborting...\n");
return -1;
}
ambitv_log(ambitv_log_info, LOGNAME "configuration finished, %d programs available.\n",
ambitv_num_programs);
for (i=0; i<ambitv_num_programs; i++)
ambitv_log(ambitv_log_info, "\t%s\n", ambitv_programs->name);
if (conf.gpio_idx >= 0) {
conf.gpio_fd = ambitv_gpio_open_button_irq(conf.gpio_idx);
if (conf.gpio_fd < 0) {
ambitv_log(ambitv_log_error, LOGNAME "failed to prepare gpio %d, aborting...\n",
conf.gpio_idx);
return -1;
} else {
ambitv_log(ambitv_log_info, LOGNAME "using gpio %d as physical button.\n",
conf.gpio_idx);
}
}
tcgetattr(STDIN_FILENO, &tt);
tt_orig = tt.c_lflag;
tt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &tt);
if (conf.program_idx >= ambitv_num_programs) {
ambitv_log(ambitv_log_error, LOGNAME "program at index %d requested, but only %d programs available. aborting...\n",
conf.program_idx, ambitv_num_programs);
goto errReturn;
}
conf.cur_prog = conf.program_idx;
ret = ambitv_program_run(ambitv_programs[conf.cur_prog]);
if (ret < 0) {
ambitv_log(ambitv_log_error, LOGNAME "failed to start initial program '%s', aborting...\n",
ambitv_programs[conf.cur_prog]->name);
goto errReturn;
}
ambitv_log(ambitv_log_info, LOGNAME "started initial program '%s'.\n",
ambitv_programs[conf.cur_prog]->name);
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK);
ambitv_log(ambitv_log_info,
LOGNAME "************* start-up complete\n"
"\tpress <space> to cycle between programs.\n"
"\tpress 't' to toggle pause.\n");
if (conf.gpio_idx >= 0) {
ambitv_log(ambitv_log_info,
"\tphysical (gpio) button: click to pause/resume, double-click to cycle between programs.\n");
}
while (conf.running && ambitv_runloop() >= 0);
ret = ambitv_program_stop_current();
if (ret < 0) {
ambitv_log(ambitv_log_error, LOGNAME "failed to stop program '%s' before exiting.\n",
ambitv_programs[conf.cur_prog]->name);
goto errReturn;
}
errReturn:
tt.c_lflag = tt_orig;
tcsetattr(STDIN_FILENO, TCSANOW, &tt);
if (conf.gpio_fd >= 0)
ambitv_gpio_close_button_irq(conf.gpio_fd, conf.gpio_idx);
return ret;
}
Alles anzeigen
Bei mir hat sich nichts verändert als ich die Werte in der ambi-tv.conf geändert hatte. Deshalb habe ich selbst Änderungen an der main.c vorgenommen. Das sind 2 paar Stiefel.
Doch wenn du die Gamma-Werte änderst, ändert sich sehr wohl etwas. Allerdings muss man erst mal verstehen was eine Gammakurve ist (http://de.wikipedia.org/wiki/Gammakorrektur). Wenn du den Gamma-Wert für Rot von sagen wir mal 1 auf 2 erhöhst heißt das nicht, dass du doppelt so viel Rot hast. Der Gamma-Wert ist nämlich der Exponent einer Potenzfunktion.
Da die Farbwertverschiebung der einzelnen Farben (Rot, Grün, Blau) nicht Linear ist, wird diese Gamma-Korrektur durchgeführt.
Vereinfacht gesagt: Jede LED besteht eigentlich aus 3 LEDs (Rot, Grün, Blau). Will ich mehr Rot muss ich Rot im Verhältnis zu Grün und Blau heller machen. Heller bedeutet mehr Strom. Da das ganze aber nicht linear verläuft d.h. 50% Strom nicht 50% Helligkeit bedeuten, braucht man die Gamma-Korrektur. Bei einem Gamma-Wert von 1 wäre es Linear (http://commons.wikimedia.org/wiki/File:Gammafrp.svg). Gut zu sehen wie sich der Gamma-Wert auswirkt ist auch hier: http://de.wikipedia.org/wiki/Gammakorr…ispiel_Monitore
Die Änderungen, die die meisten in der main.c vornehmen sind ein anderer Stiefel, wie du schon sagst. Hier wird ein Linearer Faktor vor den Farbwert gesetzt. Mit dem der Farbwert (z. B. Rot) um sagen wir mal 5% erhöht wird (Lineare Farbverschiebung). D. h. wir gleichen hier eine generelle Farbabweichung zwischen den Farben aus, und mit dem Gamma-Wert eher eine Farbabweichung innerhalb einer Farbe (Verschiebung der Helligkeit).
Doch wenn du die Gamma-Werte änderst, ändert sich sehr wohl etwas. Allerdings muss man erst mal verstehen was eine Gammakurve ist (http://de.wikipedia.org/wiki/Gammakorrektur).
nö, eben nicht .. bei mir hat sich nichts geändert. und ja eine gammakurve kenne ich ...
Zitat
Geschrieben von Grashopper.iu1 - Heute 12:50
komisch ist das ich in meiner main.c diese Gamma Einstellungen gar nicht habe.
Hier meine Main.c
das ist auch nciht die main.c die ich hier irgendwo verlinkt habe sondern die die normalerweise bei ambi-tv dabei ist..
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!