[Frage] Wie fange ich an? Komme von Fhem...

Allgemeine Fragen und Info rund um ioBroker
Antworten
caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

[Frage] Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 01.02.2017, 10:57

MOD-Edit by eric2905 - 27.04.2017/12:50 : "[Frage]" zum Betreff hinzugefügt

Hallo,

ich habe seit gestern IObroker laufen und mal den Fhem Connector aktiviert. Sehe dort alles und kann in der Webgui ja mit den Widges arbeiten. Das sieht super aus und gefällt mir sehr gut.
Unter fhem habe ich auch alexa und einie Scripte laufen. z.B. Kann ich mein Komplette Multimedianlage steuern.
Ich würde nun gerne "schleichend" komplett nach IOBroker umziehen.

Das nächste neue Szenario Atmolight der Enigma2 Box (VU) würde ich gerne an und ausschalten können. Dazu würde ich in fhem ein Dummydevice anlegen, welches mein shellscript was ich dafür erstellt habe triggert.
Wie mache ich so etwas unter IOBroker? Ich bin seit gestern dabei und finde irgendwie nichts dazu.

Benutzeravatar
Homoran
guru
Beiträge: 12245
Registriert: 08.08.2014, 16:50

Re: Wie fange ich an? Komme von Fhem...

Beitrag von Homoran » 01.02.2017, 11:09

Hallo und Willkommen im Forum!
Für beide Postings von dir kann ich dir nur allgemeine Hilfe anbieten, da ich dies alles selber nicht einsetze.

Fangen wir mal mit den Begrifflichkeiten an, damit wir nicht aneinander vorbeireden:
caravandriver hat geschrieben:ich habe seit gestern IObroker laufen und mal den Fhem Connector aktiviert.
Ich nehme an du meinst den FHEM Adapter.
caravandriver hat geschrieben:Sehe dort alles und kann in der Webgui ja mit den Widges arbeiten
Wenn du hier den Admin (<IP>:8081) meinst und dort den Reiter "Objekte" solltest du dort alle Datenpunkte aus FHEM sehen können.

Wenn du mit der WebGUI, allerdings ioBroker.vis meinst (nur dort gibt es Widgets) und die FHEM Datenpunkte in deren Konfiguration siehst, sind wir schon einmal einen großen Schritt weiter.

caravandriver hat geschrieben:Dazu würde ich in fhem ein Dummydevice anlegen, welches mein shellscript was ich dafür erstellt habe triggert.
Wie mache ich so etwas unter IOBroker? Ich bin seit gestern dabei und finde irgendwie nichts dazu.
Wenn du dieses Dummy-Device angelegt hast, sollte auch der entsprechende Datenpunkt in ioBroker erscheinen, und diesen kannst du dann über ein entsprechendes Widget (manuell) steuern.

Willst du dies jedoch interaktiv durchführen musst du mit javascript, Blockly, node-red oder dem Szenenadapter arbeiten.

Gruß
Rainer
kein Support per PN!
Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 01.02.2017, 11:14

Ja, genau ich meine ioBroker.vis - Ich kann meine Geräte ansteuern, Werte dort sehen, kein Problem... Ich könnte jetzt Problemlos eine schöne Oberfläche bauen und alle Geräte steuern.

Was mir jetzt fehlt ist das gescripte...

Ich möchte auf lange Sicht hin komplett von fhem weg und daher für das neue Szenario "atmolight" direkt alles in iobroker anlegen.

Benutzeravatar
Homoran
guru
Beiträge: 12245
Registriert: 08.08.2014, 16:50

Re: Wie fange ich an? Komme von Fhem...

Beitrag von Homoran » 01.02.2017, 11:38

caravandriver hat geschrieben:Ich könnte jetzt Problemlos eine schöne Oberfläche bauen und alle Geräte steuern.
Das hört sich ja schon mal gut an.
caravandriver hat geschrieben:Was mir jetzt fehlt ist das gescripte...
Und ich kann das gar nicht :(
Bist du denn des javascripts mächtig? Dann könntest du ja wirklich alles über ioBroker machen, und brauchst sehr wahrscheinlich auch kein Dummyscript.
Schließlich schreibst du:
caravandriver hat geschrieben:Ich möchte auf lange Sicht hin komplett von fhem weg
Für das Scripten und Blockly müsstest du dir von dem javascript Adapter eine Instanz anlegen und dann mal ansehen und etwas spielen.
Dokus für die Logik- und Script-Adapter gibt es hier
http://www.iobroker.net/?page_id=2415&lang=de
Hilfe gibt es im Forum!


Gruß
Rainer
kein Support per PN!
Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 27.04.2017, 10:29

Ich bekomme es einfach nicht hin via iobroker Script ein fhem device zu schalten:

setState('fhem.0.Tischlampe.state',on); -> geht nicht
setState("fhem.0.Tischlampe.state",on); --> geht nicht
setState("fhem.0.Tischlampe.state","on"); --> geht nicht

Wie ists richtig?

Benutzeravatar
apollon77
guru
Beiträge: 5169
Registriert: 10.04.2015, 12:27

Re: Wie fange ich an? Komme von Fhem...

Beitrag von apollon77 » 27.04.2017, 10:33

Ich denke true/false ?!
How-to:
* Debug-Log für einen Adapter/Instanz einschalten? -> Instanzen -> Expertenomodus -> Spalte Loglevel

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 27.04.2017, 10:34

habe ich auch durch... macht nix.

Benutzeravatar
apollon77
guru
Beiträge: 5169
Registriert: 10.04.2015, 12:27

Re: Wie fange ich an? Komme von Fhem...

Beitrag von apollon77 » 27.04.2017, 10:35

Dann geh mal auf "objekte" und suche das Obkeklt. Dann rechts das Stiftsymbol. Und sag mal was da steht ... oder kopiere dass "raw experts only" JSON mal hierher
How-to:
* Debug-Log für einen Adapter/Instanz einschalten? -> Instanzen -> Expertenomodus -> Spalte Loglevel

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 27.04.2017, 11:39

Jetzt klappt es:

Code: Alles auswählen

setState('fhem.0.Wohnzimmerlampe.state',true);
Ich schaue mir gerade das Abwesenheitssimulationsscript an.
Spoiler: Show hidden text

Code: Alles auswählen

//..........Anwesenheitssimulation AWS Version 0.80
//..........Datum: 28.12.2015
//..........Autor: Looxer01
//..........Forum ioBroker
//..........http://forum.iobroker.com/posting.php?mode=post&f=21&sid=b3b2a31dae55081fedaf0ad9c8d74acd
//
//..........Änderungshistorie
//..........Version 0.10 Initial 28.12.2015
//..........Version 0.11 29.12.2015 Einstellungen um Astrozeiten erweitert (noch ohne Funktion)
//.........,Version 0.12 29.12.2015 EVENT Deaktivierung von AWS hinzugefügt: Schreiben Log und loeschen Schedules
//...............................................Aktivierung von AWS hihzugüfügt: Schreiben Log bei Aktivierung
//..........Version 0.13 29.12.2015 das Schreiben des externen Logs optional gemacht - unter Einstellungen auswaehlbar
//..........Version 0.20 29.12.2015 Astrozeit Funktion hinzugefügt. Astrozeit wird je IDGruppe auf true/false gesetzt und overruled die variablen zeit1von,zeit2von,zeit3von,zeit4von,zeit5von
//..........Version 0.30 29.12.2015 Umarbeitung zur Verkürzung des Scripts
//..........Version 0.31 30.12.2015 Fehlerbeseitigung in IDGruppen3 und 4 - einige Code Hygiene Massnahmen
//..................................Umbenennung der IDGruppen mit führend "ID" / Startverzögerungseinstellungen hinzugefügt
//..........Version 0.32 30.12.2015 umgestellt auf setStateDelayed / Startverzögerungsfunktion hinzugefügt.
//..........Version 0.33 31.12.2015 Fehler mit EVAL Funktion gefixt / Fehler mit Startverzoegerung und Einschaltzeiten gefixt
//..................................Funktion Anzahl von Geraete Teilnehmer zur Geraete ID bestimmung hinzugefügt
//..........Version 0.40 01.01.2016 Log-Pfad variablel gemacht // Log-File Format umgearbeitet und Headerline hinzugefügt fuer externes Log. Internes Log ueberarbeitet
//..........Version 0.41 02.01.2016 Funktionen von Baetz zum TimeInRange Check hinzugefuegt. Keine Globale Funktion mehr notwendig. -- Kommentarte ueberarbeitet
//..........Version 0.42 02.01.2015 Herkunftsnachweis für IsTimeInRange Funktion hinzugefuegt
//..................................Fehler zur zufaelligen Geraete Findung behoben. Das letzte Geraet wurde nie ausgewaehlt // Fehler im log "Gearaet wurde nicht eingeschaltet wurde gelogged auch wenn es eingeschaltet wurde"
//..........Version 0.43 03.01.2015 Wenn AWS auf inaktiv gesetzt wird, dann werden alle teilnehmenden Geraete ausgeschaltet -  Dokumentation der Variablen / variablen deklaration nachgeholt fuer zwei Faelle
//..........Version 0.44 04.01.2015 Addieren der Einschaltverzoegerung zur Ausschaltzeit fuer die Ausschaltzeitberechnung // Fixed Fehler doppelte Schaltung fuer STATE geraete
//..........Version 0.45 04.01.2015 weiterer Fehler zur Berechnung der Ausschaltzeit korrigiert
//..........Version 0.50 04.01.2015 Beseitigung unnötiges Coding // Ueberpruefung ob Geraet existiert hinzugefuegt - LogMeldung falls nicht hinzugefuegt. - kein Javascript restart mehr, wenn geraet nicht existiert
//..........Version 0.60 04.01.2015 Ausschalten der Teilnehmer bei Deaktivierung optimiert. Ausschaltung optional gemacht / Astrozeit ueberarbeitet
//..................................Astrozeit auch fuer die bis Zeit hinzugefuegt. Damit lassen sich Schaltungen bis zum Sonnenaufgang umsetzen / weitere Codeoptimierungen
//..........Version 0.61 05.01.2015 Beim  Ausschalten Verzoegerung zwischen Schaltvorgange eingebaut  / Codeiptimierung bei den Gruppen Schedules / Fehler bei der  GrpZufAnz und StartDelay beseitigt fuer Gruppen 2-5
//..........Version 0.65 06.01.2015 Reaktion bei bereits eigneschalteten Lampen variabel gemacht / Codeoptimierungen / ID fuer AWS-Aktiv ist jetzt variabel
//..........Version 0.70 26.01.2015 SetStateDelayed ist jetzt in javascript gefixt ab JS version 1.1.2 - Das Loeschen von Ein/Auschaltplanungen wird jetzt mit dem neuen Befehl clearStateDelayed gemacht
//..................................Vorläufig wurde das Merken der letzten Aktion geloescht, da es keine Verwendung im Moment hat
//..........Version 0.75 27.01.2015 Fehler beim Loeschen von Ein/Auschaltplanungen behoben - Es wurde nicht geloescht, wenn Verbraucher eingeschaltet bleiben sollen
//..........Version 0.80 28.04.2016 Fehler mit der Astrozeit, wenn die BisZeit < ist als die Astrozeit(von) beseitigt


//// Das Script wird aktiviert, wenn das Flag "Anwesenheitssteuerung gesetzt wird"
// HIER Einstellungen vornehmen............................................................................................


// Einstellungen der Aktivzeiten je IDGruppe von bis
var zeit1von = "12:00:00";  //Aktivzeit von IDGruppe1
var zeit1bis = "21:30:00";  //Aktivzeit bis IDGruppe1

var zeit2von = "12:15:00";  //Aktivzeit von IDGruppe2
var zeit2bis = "13:30:00";  //Aktivzeit bis IDGruppe2

var zeit3von = "12:30:00";  //Aktivzeit von IDGruppe3
var zeit3bis = "14:00:00";  //Aktivzeit bis IDGruppe3

var zeit4von = "12:00:00";  //Aktivzeit von IDGruppe4
var zeit4bis = "13:00:00";  //Aktivzeit bis IDGruppe4

var zeit5von = "12:00:00";  //Aktivzeit von IDGruppe5
var zeit5bis = "13:00:00";  //Aktivzeit bis IDGruppe5

// Wenn Astrozeit auf true steht, dann wird die vonZeit durch die Astrozeit übersteuert
var vonAstro1 = true ;  // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe1
var vonAstro2 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe2
var vonAstro3 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe3
var vonAstro4 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe4
var vonAstro5 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe5



// Wenn bis Astrozeit auf true steht, dann wird die bisZeit durch die Astrozeit übersteuert
var bisAstro1 = false ;  // die zeit1von wird ersetzt durch die Astrozeit -  setting ist optional true = Verwendung der Astrozeit - IDGruppe1
var bisAstro2 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe2
var bisAstro3 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe3
var bisAstro4 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe4
var bisAstro5 = false ;  // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe5


// Einstellungen der zufaelligen Einschaltdauer je IDGruppe von bis
var ein1von = 1;   // Minuten IDGruppe1 von
var ein1bis = 10;   // Minuten IDGruppe1 bis
var ein2von = 10;   // Minuten IDGruppe2 von
var ein2bis = 30;   // Minuten IDGruppe2 bis
var ein3von = 5;   // Minuten IDGruppe3 von
var ein3bis = 20;   // Minuten IDGruppe3 bis
var ein4von = 20;   // Minuten IDGruppe4 von
var ein4bis = 45;   // Minuten IDGruppe4 bis
var ein5von = 10;   // Minuten IDGruppe5 von
var ein5bis = 30;   // Minuten IDGruppe5 bis


// Einstellung je Gruppe für die  maximale  Startverzögerung in Minuten
// bei 0 = keine Startverzögerung - bei z.B. 10 = Startverzögerung zwischen 0 und 10 in Minuten
//
var StartDelay1 = 0;   // Maximale Startverzoegerung Gruppe1
var StartDelay2 = 0;   // Maximale Startverzoegerung Gruppe2
var StartDelay3 = 0;   // Maximale Startverzoegerung Gruppe3
var StartDelay4 = 0;   // Maximale Startverzoegerung Gruppe4
var StartDelay5 = 0;   // Maximale Startverzoegerung Gruppe5




// Einstellung Check-schedule  - Voreinstellung z.B. alle 30  Minuten je IDGruppe - Damit wird je Lauf nach Zufaelligkeit je ein Geraet der IDGruppe eingeschaltet
var cron1 = 1;  // checks alle x Minuten für IDGruppe1
var cron2 = 1; //  checks alle x Minuten für IDGruppe2
var cron3 = 1; //  checks alle x Minuten für IDGruppe3
var cron4 = 1; //  checks alle x Minuten für IDGruppe4
var cron5 = 0; //  checks alle x Minuten für IDGruppe5



// Einstellung teilnehmende Homematic Geräte je IDGruppe maximal 5 - Eingabe der Homematic ID
var     IDGruppe11 = "fhem.0.Vitrine.state";
var     IDGruppe12 = "fhem.0.Tischlampe.state";
var     IDGruppe13 = "fhem.0.Treppe.state";
var     IDGruppe14 = "";  // Licht Kinderbad
var     IDGruppe15 = "";  // Licht Hobbyraum
var     Grp1ZufAnz = 3;              // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes 

var     IDGruppe21 = "fhem.0.Vitrine.state";  // Licht Wohnzimmer Esstisch Deckenlampe
var     IDGruppe22 = "fhem.0.Tischlampe.state";  // Licht Terrassentuere
var     IDGruppe23 = "fhem.0.Treppe.state";  // Licht Wohnzimmer Esstisch Stehlampe
var     IDGruppe24 = "  ";
var     IDGruppe25 = "  "; 
var     Grp2ZufAnz = 3;              // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes 


var     IDGruppe31 =  "fhem.0.Vitrine.state";  // Licht Flur oben Wand;
var     IDGruppe32 =  "fhem.0.Tischlampe.state";  // Licht Flur oben unten; 
var     IDGruppe33 =  "fhem.0.Treppe.state";  // Licht Kinderbad
var     IDGruppe34 = "  ";
var     IDGruppe35 = "  "; 
var     Grp3ZufAnz = 3;              // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes 


var     IDGruppe41 = "fhem.0.Vitrine.state"; 
var     IDGruppe42 = "fhem.0.Tischlampe.state";  
var     IDGruppe43 = "fhem.0.Treppe.state"; 
var     IDGruppe44 = "  ";
var     IDGruppe45 = "  "; 
var     Grp4ZufAnz = 3;              // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes 


var     IDGruppe51 = "fhem.0.Vitrine.state";
var     IDGruppe52 = "fhem.0.Tischlampe.state"; 
var     IDGruppe53 = "fhem.0.Treppe.state";
var     IDGruppe54 = "  ";
var     IDGruppe55 = "  ";
var     Grp5ZufAnz = 3;              // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes 

var logflag = true;     // wenn auf true dann wird das logging in Datei /opt/iobroker/iobroker-data/AWSLog.csv eingeschaltet bei false vice versa

var ausflag = false;     // Wenn AWS deaktiviert wird, dann werden alle Teilnehmer ausgeschaltet


// Ende Einstellungen .......................................................................................................



// Experten-Einstellungen .......................................................................................................

createState('Anwesenheitssteuerung.AWSAktiv',true);
var IDAWSaktiv = "javascript.0.Anwesenheitssteuerung.AWSAktiv";     // in den objekten angelegte variable zur Bestimmung ob AWS aktiv ist - Kann auch ausgetauscht werden durch eine andere
var LogPath = "/opt/iobroker/iobroker-data/AWSLog.csv";             // Pfad und Dateiname des externen Logs
var IgnoreWhenOn = false;                                           // bei true: Ignoriert den Schaltvorgang, wenn das Geraet bereits eingeschaltet war

// Ende Experten-Einstellungen .......................................................................................................


var fs = require('fs');                     // enable write fuer externes log
var cron1job = "*/"+cron1+" * * * *";       // CRON pattern aufgrund der Vorgabe in den Einstellungen
var cron2job = "*/"+cron2+" * * * *";       // CRON pattern aufgrund der Vorgabe in den Einstellungen
var cron3job = "*/"+cron3+" * * * *";       // CRON pattern aufgrund der Vorgabe in den Einstellungen
var cron4job = "*/"+cron4+" * * * *";       // CRON pattern aufgrund der Vorgabe in den Einstellungen
var cron5job = "*/"+cron5+" * * * *";       // CRON pattern aufgrund der Vorgabe in den Einstellungen
var x = 0;                                  // Geraetenummer der Gruppe, die zufaellig ausgewaehlt wurde
var y = 0;                                  //  Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
var z = 0;                                  // Einschaltverzögerung aufgrund der Zufallszahl
var string = " ";                           // Logstring
var logtext=" " ;                           // Kommentar im log
var objIDGruppe = " ";                      // uebergabe an Funktion der IDGruppe zum Schalten des Geraetes
var SpaceChk = new RegExp(/\s/);            // pattern um zu pruefen ob eine IDGruppe blanks enthaelt


// Execute IDGruppe1     
//-------------------------------------------------------------------------------------------------------------------------------------------------------
schedule(cron1job, function() {
if  (getState(IDAWSaktiv).val === true) {     // AWS aktiv ?
    zeit1von = astrojetzt(zeit1von,zeit1bis,"von",vonAstro1,bisAstro1);             // endif - setzen der abweichenden von-Zeit falls Astro aktiv
    zeit1bis = astrojetzt(zeit1von,zeit1bis,"bis",vonAstro1,bisAstro1);             // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
//    if (vonAstro1 === true) {   zeit1von = astrojetzt(zeit1von,"von");   }          // endif - setzen der abweichenden von-Zeit falls Astro aktiv
//    if (bisAstro1 === true) {   zeit1bis = astrojetzt(zeit1bis,"bis");   }          // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
    if(isTimeInRange(zeit1von, zeit1bis)) {                                         // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
log("astrozeit1von  gesetzt von " + zeit1von + " bis " + zeit1bis ,"info");    
        x = zufall(1,Grp1ZufAnz,x);                                                 // Ermittlung zufaelliges Geraet zum enschalten
        z = zufall(0,StartDelay1*60,y)*1000;                                        // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl
        y = zufall(ein1von*60,ein1bis*60,y)*1000;                                   // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
        var IDGruppe = "IDGruppe1" + x;                                             // Ermittlung Gruppenname z.B. IDGruppe11
        if (x <= 5 && GeraetExists(IDGruppe)) {    AWSSchaltung(IDGruppe,y,z);  }   // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten
    } // Ende Zeitcheck
}  // Endeif für AWS-Aktivflag check   
}); // end schedule IDGruppe1


// Execute IDGruppe2     
//-------------------------------------------------------------------------------------------------------------------------------------------------------
schedule(cron2job, function() {
if  (getState(IDAWSaktiv).val === true) {     // AWS aktiv ?
    zeit2von = astrojetzt(zeit2von,zeit2bis,"von",vonAstro2,bisAstro2);             // endif - setzen der abweichenden von-Zeit falls Astro aktiv
    zeit2bis = astrojetzt(zeit2von,zeit2bis,"bis",vonAstro2,bisAstro2);             // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
//    if (vonAstro2 === true) {   zeit2von = astrojetzt(zeit2von,"von");   }          // endif - setzen der abweichenden von-Zeit falls Astro aktiv
//    if (bisAstro2 === true) {   zeit2bis = astrojetzt(zeit2bis,"bis");   }          // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
    if(isTimeInRange(zeit2von, zeit2bis)) {                                         // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
        x = zufall(1,Grp2ZufAnz,x);                                                 // Ermittlung zufaelliges Geraet zum enschalten
        z = zufall(0,StartDelay2*60,y)*1000;                                        // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl
        y = zufall(ein2von*60,ein2bis*60,y)*1000;                                   // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
        var IDGruppe = "IDGruppe2" + x;                                             // Ermittlung Gruppenname z.B. IDGruppe21
        if (x <= 5 && GeraetExists(IDGruppe)) {    AWSSchaltung(IDGruppe,y,z);  }   // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten
    } // Ende Zeitcheck
}  // Endeif für AWS-Aktivflag check   
}); // end schedule IDGruppe2


// Execute IDGruppe3   
//-------------------------------------------------------------------------------------------------------------------------------------------------------
schedule(cron3job, function() {
if  (getState(IDAWSaktiv).val === true) {     // AWS aktiv ?
    zeit3von = astrojetzt(zeit3von,zeit3bis,"von",vonAstro3,bisAstro3);             // endif - setzen der abweichenden von-Zeit falls Astro aktiv
    zeit3bis = astrojetzt(zeit3von,zeit3bis,"bis",vonAstro3,bisAstro3);             // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
//    if (vonAstro3 === true) {   zeit3von = astrojetzt(zeit3von,"von");   }          // endif - setzen der abweichenden von-Zeit falls Astro aktiv
//    if (bisAstro3 === true) {   zeit3bis = astrojetzt(zeit3bis,"bis");   }          // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
    if(isTimeInRange(zeit3von, zeit3bis)) {                                         // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
        x = zufall(1,Grp3ZufAnz,x);                                                 // Ermittlung zufaelliges Geraet zum enschalten
        z = zufall(0,StartDelay3*60,y)*1000;                                        // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl
        y = zufall(ein3von*60,ein3bis*60,y)*1000;                                   // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
        var IDGruppe = "IDGruppe3" + x;                                             // Ermittlung Gruppenname z.B. IDGruppe31
        if (x <= 5 && GeraetExists(IDGruppe)) {    AWSSchaltung(IDGruppe,y,z);  }   // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten
  } // Ende Zeitcheck
}  // Endeif für AWS-Aktivflag check   
}); // end schedule IDGruppe3



// Execute IDGruppe4   
//-------------------------------------------------------------------------------------------------------------------------------------------------------
schedule(cron4job, function() {
if  (getState(IDAWSaktiv).val === true) {     // AWS aktiv ?
    zeit4von = astrojetzt(zeit4von,zeit4bis,"von",vonAstro4,bisAstro4);             // endif - setzen der abweichenden von-Zeit falls Astro aktiv
    zeit4bis = astrojetzt(zeit4von,zeit4bis,"bis",vonAstro4,bisAstro4);             // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
//    if (vonAstro4 === true) {   zeit4von = astrojetzt(zeit4von,"von");   }          // endif - setzen der abweichenden von-Zeit falls Astro aktiv
//    if (bisAstro4 === true) {   zeit1bis = astrojetzt(zeit4bis,"bis");   }          // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
    if(isTimeInRange(zeit4von, zeit4bis)) {                                         // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
        x = zufall(1,Grp4ZufAnz,x);                                                 // Ermittlung zufaelliges Geraet zum enschalten
        z = zufall(0,StartDelay4*60,y)*1000;                                        // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl
        y = zufall(ein4von*60,ein4bis*60,y)*1000;                                   // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
        var IDGruppe = "IDGruppe4" + x;                                             // Ermittlung Gruppenname z.B. IDGruppe41
        if (x <= 5 && GeraetExists(IDGruppe)) {    AWSSchaltung(IDGruppe,y,z);  }   // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten
    } // Ende Zeitcheck
}  // Endeif für AWS-Aktivflag check   
}); // end schedule IDGruppe4



// Execute IDGruppe5   
//-------------------------------------------------------------------------------------------------------------------------------------------------------
schedule(cron5job, function() {
if  (getState(IDAWSaktiv).val === true) {     // AWS aktiv ?
    zeit5von = astrojetzt(zeit5von,zeit5bis,"von",vonAstro5,bisAstro5);             // endif - setzen der abweichenden von-Zeit falls Astro aktiv
    zeit5bis = astrojetzt(zeit5von,zeit5bis,"bis",vonAstro5,bisAstro5);             // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
//    if (vonAstro5 === true) {   zeit5von = astrojetzt(zeit5von,"von");   }          // endif - setzen der abweichenden von-Zeit falls Astro aktiv
//    if (bisAstro5 === true) {   zeit5bis = astrojetzt(zeit5bis,"bis");   }          // endif - setzen der abweichenden bis-Zeit falls Astro aktiv
    if(isTimeInRange(zeit5von, zeit5bis)) {                                         // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
        x = zufall(1,Grp5ZufAnz,x);                                                 // Ermittlung zufaelliges Geraet zum enschalten
        z = zufall(0,StartDelay5*60,y)*1000;                                        // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl
        y = zufall(ein5von*60,ein5bis*60,y)*1000;                                   // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden
        var IDGruppe = "IDGruppe5" + x;                                             // Ermittlung Gruppenname z.B. IDGruppe51
        if (x <= 5 && GeraetExists(IDGruppe)) {    AWSSchaltung(IDGruppe,y,z);  }   // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten
  } // Ende Zeitcheck
}  // Endeif für AWS-Aktivflag check   
}); // end schedule IDGruppe5




// ------------------------Ruecksetzen der Timeouts /Ausschalten der teilnehmenden Geraete, wenn AWS-Aktiv auf false gesetzt wird--------------

on({id: IDAWSaktiv, val: false }, function(obj)      // Event:  wenn AWS Flag auf nicht aktiv gesetzt wurde
{

    var objGruppeI =    " ";    // Baut die IDGruppe zusammen Position 1
    var objGruppeJ =    " ";    // Baut die IDGruppe zusammen Position 2
    var countobj   =    0;      //counter fuer Verzoegerungen zwischen den Ausschaltungen

    for (i = 1; i <= 5; i++) {                                                              // Loop fuer die Gruppen-Nr
        objGruppeI = "IDGruppe" + i;                                                        // Loop fuer die Geraete Nr der IDGruppen 1 - 5
           for (j = 1; j <= 5; j++) {                                                       // Loop Position 2 /1 - 5 )
                objGruppeJ = objGruppeI + j ;                                               // Ermittlung Position 2
                if (SpaceChk.test(eval(objGruppeJ))) {                                      // Check for  blanks
                } else {                                                                    // keine blanks
                       if (GeraetExists(objGruppeJ) === true) {                             // Gibt es das Geraet 
                           clearStateDelayed(eval(objGruppeJ));                             // Alle Pläne der Gruppe loeschen
                           if (ausflag) {                                                   // sollen die Teilnehmer ausgeschaltet werden ?  
                            setStateDelayed(eval(objGruppeJ), false, countobj);             // ausschalten mit je  300 millisekunden wartezeit
                           }                                                                // endif check ob Geraete ausgeschaltet werden sollen
                           countobj = countobj + 300;                                       // alle 300 millisekunden schalten
                       } // endif fuer Geraetecheck und switch off
                } // end Space Check
          } //  Ende Position 2 Loop
    }  // Ende Position 1 Loop
    log("EVENT  AWS deaktiviert Der schedule zur geplanten Ausschaltung von Geraeten wurde zurueckgesetzt " ,"info"); 
    string = ";;;;;;;AWS wurde deaktiviert - Der schedule zur geplanten Ausschaltung von Geraeten wurde zurueckgesetzt";           // bereite LOG vor

    writelog(string);                                                                           // schreibe LOG in Datei

}); // ende on id


// ------------------------schreibe Log wenn AWS aktiviert wurde--------------------------------------

on({id: IDAWSaktiv, val: true }, function(obj)       // Event:  wenn AWS Flag auf nicht aktiv gesetzt wurde
{

log("EVENT  AWS wurde aktiviert " ,"info"); 
string = ";;;;;;;AWS wurde aktiviert";                                                  // bereite LOG vor
writelog(string);     


}); // ende on id

// ------------------------ F U N K T I O N E N -------------------------------------------------------

//-----------------------------------------------------------------------------------------------------
// Diese Funktion schaltet die IDGruppenmitglieder der gerade zu berabeitenden IDGruppe
//-----------------------------------------------------------------------------------------------------
function AWSSchaltung(objIDGruppe,y,z) {
    logtext = " ";
    if (eval(objIDGruppe).match('STATE')) {                                             // ist es ein STATE Geraet ?
       if  (getState(eval(objIDGruppe)).val === false ) {                               // nur wenn noch nicht eingeschaltet
          setStateDelayed(eval(objIDGruppe), true,  z);                                 // Licht an in z millisekunden
//          var timer = setTimeout(function (){                                                                             
//             setState(eval(objIDGruppe),0);   }, z+y);                                //Licht aus in y millisekunden   (Einschaltverzoegerung plus Einschaltdauer)                
               setStateDelayed(eval(objIDGruppe), false, z+y, false);                   //Licht aus in z+y millisekunden   (Einschaltverzoegerung plus Einschaltdauer)
       } else {                                                                         // else - Geraet ist schon eingeschaltet
           if (IgnoreWhenOn) {                                                          //keine  Reaktion wenn Geraet bereits eingeschaltet war
                logtext = "keine Aktion - Geraet war bereits eingeschaltet";   
           } else {                                                                     // else - es soll uebersteuert werden mit den neuen werten
                z = 0;                                                                  // Einschaltverzoegerung setzen auf Null
                setStateDelayed(eval(objIDGruppe), false, z+y, true );                  //Licht aus in z+y millisekunden   (Einschaltverzoegerung plus Einschaltdauer) ohne Einschaltverzoegerung
                logtext = "Geraet war bereits eingeschaltet -- uebersteuert - ohne Einschaltverzoegerung -  alter schedule geloescht- ";     
           }          // endeif IgnoreWhenOn
       }        // Ende IF fuer Check ob bereits eingeschaltet
    } // Ende IF für STATE Geraete
       
    if (eval(objIDGruppe).match('LEVEL')) {                                             // ist es ein LEVEL Geraet ?
       if  (getState(eval(objIDGruppe)).val === 0 ) {                                   // nur wenn noch nicht eingeschaltet
            setStateDelayed(eval(objIDGruppe), 100,  z);                                // Licht an in z millisekunden
//            var timer = setTimeout(function (){                                                                             
//                setState(eval(objIDGruppe),0);   }, z+y);                             //Licht aus in y millisekunden   (Einschaltverzoegerung plus Einschaltdauer)                
            setStateDelayed(eval(objIDGruppe), 0, z+y, false);                          //Licht aus in y millisekunden   (Einschaltverzoegerung plus Einschaltdauer)
       } else {                                                                         // else - Geraet ist schon eingeschaltet
        if (IgnoreWhenOn) {                                                             //keine  Reaktion wenn Geraet bereits eingeschaltet war
                logtext = "keine Aktion - Geraet war bereits eingeschaltet";   
           } else {                                                                     // else - es soll uebersteuert werden mit den neuen werten     
                z = 0;                                                                  // Einschaltverzoegerung setzen auf Null
                 setStateDelayed(eval(objIDGruppe), 0, z+y, true);                      //Licht aus in z+y millisekunden   (Einschaltverzoegerung plus Einschaltdauer) ohne Einschaltverzoegerung
                 logtext = "Geraet war bereits eingeschaltet -- uebersteuert - ohne Einschaltverzoegerung -  alter schedule geloescht- ";     
           }    // endeif IgnoreWhenOn
        }     // Ende IF fuer Check ob bereits eingeschaltet 
     } // Ende IF für LEVEL Geraete

        var GeraeteName = getObject(eval(objIDGruppe)).common.name;                         // Name des Geraetes in Klartext
        var now =    new Date();                                                            // store current date and time
        var currSec = now.getTime();                                                        // millisekunden seit 01.01.1970 /current millisecs
        var berechnEinZeit = millisecToDate( currSec + z);                                  // millisecs in Zeit umrechnen fuer die Einschaltzeit
        var berechnAusZeit = millisecToDate(currSec + z + y);                               // millisecs in Zeit umrechnen fuer die Ausschaltzeit
//        WriteArray(objIDGruppe,timer, currSec + z, currSec + z + y)                                             // Merken des Schaltvorganges
        string = objIDGruppe+";" + eval(objIDGruppe) +";" +  GeraeteName + ";" + z/1000 + ";" +y/1000+";"+berechnEinZeit + ";" + berechnAusZeit + ";" + logtext;     // bereite LOG vor
        log("EVENT " + objIDGruppe + "; " + eval(objIDGruppe) + "; " +  GeraeteName + "; " + z/1000 + "; " + y/1000 + "; " + berechnEinZeit + "; " + berechnAusZeit + "; " + logtext, "info");  //Log schreiben
        writelog(string);                                                               // schreibe LOG in Datei
        Logtext = " ";
                
} // Ende Funktion

//-----------------------------------------------------------------------------------------------------
// Funktion merkt sich den letzten Schaltvorgang zum Loeschen des Schedules und auch zur Optimierung der Schaltvorgaenge
//-----------------------------------------------------------------------------------------------------
//function WriteArray(objIDGruppe,timer,von,bis) {
//   log("EVENT " + objIDGruppe + "; " +  von + "; " + bis + "; " , "info");  

 //for (var i = 0; i <=25; ++i) { 
//      if ( Gruppen[i][0].slice(6,8) === objIDGruppe.slice(8,10)) {    // Identifikation der Objektgruppe
//            Gruppen[i][1] = timer; Gruppen[i][2] = von;  Gruppen[i][3] = bis;       // Schreibe Werte in Array 
 //         log("Arrayliste "+ Gruppen[i][0] + " " + " " + Gruppen[i][0].slice(7,2) + objIDGruppe.slice(9,2) ),"info";
//            log("Arrayliste "+ Gruppen[i][0] + " " + Gruppen[i][1] + " " + Gruppen[i][2] + " " + Gruppen[i][3] ),"info";
//
//      }   // ende if - Identifikation der Gruppe

//    } // ende for Schleife
//return Gruppen;
// } // ende Funktion

//-----------------------------------------------------------------------------------------------------
// Funktion zur Bestimmung einer ganzzahligen Zufallszahl innerhalb vorgegebener min/max Werte
//-----------------------------------------------------------------------------------------------------
function zufall(low,high,back) {
  back = Math.floor(Math.random() * (high - low + 1)) + low;   
//  log("EVENT  AWS Zufallszahlen - low = " + low + "high = " + high + " back = " + back ,"info"); 
 return back;
} // ende Funktion


//-----------------------------------------------------------------------------------------------------
// Funktion zur Ueberpruefung ob die angegebenen Geraete exisiteren
//-----------------------------------------------------------------------------------------------------
function GeraetExists(objGruppe) {
back = false;
  
if (SpaceChk.test(eval(objGruppe))) {                     // objIDGruppe darf kein space enthalten  // ist ein Geraet ueberhaupt zugeordnet ?
//         log("Geraet hat kein assignment - Gruppe " + objGruppe, "info"); 
         return back;
 } //  endif IDGruppe hat kein assignment

if  (getState(eval(objGruppe)))   { // Existiert das Geraet ?
         back = true;
    } else {     log("Geraet existiert nicht - bitte in den Einstellungen ueberpruefen - Gruppe " + objGruppe, "info"); 
} //  endif check on Geraet exists

return back;
} // ende Funktion


//-----------------------------------------------------------------------------------------------------
// Funktion schreibt einen Logeintrag in das Filesystem und auch in das interne Log-System
//-----------------------------------------------------------------------------------------------------
function writelog(string) {
    if (logflag === true) {
     // Zerlege Datum und Zeit in Variable
        var now =    new Date(); // store current date and time
        var year =   now.getFullYear();
        var month =  addZero(now.getMonth()+1);
        var day =    addZero(now.getDate());
        var Thour =  addZero(now.getHours());
        var Tmin =   addZero(now.getMinutes());
        var Tsec =   addZero(now.getSeconds());
        var logdate = day + '.' + month + '.' + year;
        var logtime = Thour + ':' + Tmin + ':' + Tsec;



if (fs.existsSync(LogPath)) {
    fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n");       // Füge Satz in Datei ein
    } else {     
        log("Logfile nicht gefunden - wird angelegt"), "info";
        var headerLine= "Datum;Uhrzeit;Gruppe;GeraeteID;Geraetebezeichnung;Einschaltverzoegerung;LaengeSchaltzeit;ZeitEin berechnet;ZeitAus berechnet;Kommentar"    
        fs.appendFileSync(LogPath, headerLine + "\n");       // Füge Satz in Datei ein
        fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n");       // Füge Satz in Datei ein
      }  // endif Filecheck
    } ; // Ende check on logflag
} // Ende Funktion


//------------------------Ermittlung der Zeit wenn Astrozeit eingeschaltet wird
// Funktion bestimmt ob die Astrozeit die Gültigkeitsbereich der VonZeit overruled
//-----------------------------------------------------------------------------------------------------

function astrojetzt(zeitvon, zeitbis, abschnitt,astrovon,astrobis) {
var sunriseEnd = getAstroDate("sunriseEnd");                                    // Ende der Nacht nach Astro
var sunsetStart = getAstroDate("sunsetStart");                                  // Ende des Tages nach Astro
var nowvon;                                                                     // fuer astrozeitrechnung vonzeit
var nowbis;                                                                     // fuer astrozeitrechnung vonzeit
var Thour;                                                                      // Stunde mit führender Null
var Tmin;                                                                       // Minute mit führender Null
var lower;                                                                      // Zeitvergleich
var upper;                                                                      // Zeitvergleih
var zeit;                                                                       // Rueckgabezeit


if(astrovon === true ) {                                                        // Astrozeit gesetzt
    nowvon      =  new Date(sunsetStart);                                       // store sunset date and time vonZeit 
    Thour       =  addZero(nowvon.getHours());                                  // extract hour
    Tmin        =  addZero(nowvon.getMinutes());                                // extract min
    zeitvon = Thour + ':' + Tmin + ':' + "00";                                  // Zusammensetzen der Zeit in Format hh:mm:ss
}

if(astrobis === true ) {                                                        // Astrozeit gesetzt
    nowbis      =  new Date(sunriseEnd);                                        // store sunset date and time vonZeit  
    Thour       =  addZero(nowbis.getHours());                                  // extract hour
    Tmin        =  addZero(nowbis.getMinutes());                                // extract min
    zeitbis = Thour + ':' + Tmin + ':' + "00";                                  // Zusammensetzen der Zeit in Format hh:mm:ss
}


if (abschnitt === "von") {                                                      // wenn vonZeit berechnet wird 
    lower = addTime(zeitvon);                                                   // vonZeit muss kleiner sein als bis Zeit
    upper = addTime(zeitbis);                                                   // bisZeit muss groesser sein als vonZeit
    zeit = zeitvon;
    if (upper < lower && astrovon === true && astrobis === false) {             // Sonderfall wenn die biszeit kleiner als die astrozeit ist
        zeit = zeitbis;                                                         // wenn die Astrozeit groesser wird als die BisZeit, dann ist vonZeit = bisZeit
    }
}

if (abschnitt === "bis") {                                                      // nur Rückgabewert setzen
    zeit = zeitbis;
}

return zeit;                                                                    // fertig
    
} // Ende Funktion




//-----------------------------------------------------------------------------------------------------
// Funktion zur Erzeugung von führenden Nullen für das Datum Format
//-----------------------------------------------------------------------------------------------------
function addZero(i) {
    if (i < 10) {
        i = "0" + i;
    }
    return i;
} // Ende Funktion

 //-----------------------------------------------------------------------------------------------------
// Funktion Millisekunden in Datum/Zeit  umrechnen /wird für logging benoetigt
//-----------------------------------------------------------------------------------------------------
function millisecToDate(millisec) {
        var time = new Date(millisec);
        var Thour =  addZero(time.getHours());
        var Tmin =   addZero(time.getMinutes());
        var Tsec =   addZero(time.getSeconds());
        datum = Thour + ':' + Tmin + ':' + Tsec;
       return datum;
} // Ende Funktion
     
//-----------------------------------------------------------------------------------------------------
// 3 Funktionen zum Zeitrange check zur Prüfung ob die Schaltungszeiten erreicht sind
// Autor ist Beatz - uebernommen aus:
// viewtopic.php?f=21&t=1072&p=11167&hilit=isTimeInRange&sid=4dca8ea2c7f9337cdc73a1a9e4824a40#p11167
//-----------------------------------------------------------------------------------------------------
function isTimeInRange(strLower, strUpper) {
    var now = new Date();
    var lower = addTime(strLower);
    var upper = addTime(strUpper);
    var inRange = false;
    if (upper > lower) {
        // opens and closes in same day
        inRange = (now >= lower && now <= upper) ? true : false;
    } else {
        // closes in the following day
        inRange = (now >= upper && now <= lower) ? false : true;
    }
    return inRange;
} 

function currentDate() {
    var d = new Date();
    return new Date(d.getFullYear(), d.getMonth(), d.getDate());
}
function addTime(strTime) {
    var time = strTime.split(':');
    var d = currentDate();
    d.setHours(time[0]);
    d.setMinutes(time[1]);
    d.setSeconds(time[2]);
    return d;
}

Leider bekomme ich da aber kein Ergebnis:
12:38:32.516 [info] javascript.0 Stop script script.js.common.anwesenheitsim
12:38:33.303 [info] javascript.0 Start javascript script.js.common.anwesenheitsim
12:38:33.306 [info] javascript.0 script.js.common.anwesenheitsim: registered 2 subscriptions and 5 schedules
12:38:57.544 [info] javascript.0 script.js.common.anwesenheitsim: EVENT AWS wurde aktiviert
12:39:00.303 [info] javascript.0 script.js.common.anwesenheitsim: astrozeit1von gesetzt von NaN:NaN:00 bis 21:30:00
12:39:00.303 [info] javascript.0 script.js.common.anwesenheitsim: EVENT IDGruppe13; fhem.0.Treppe.state; Treppe state; 0; 269; 10:39:00; 10:43:29;
12:39:01.545 [info] javascript.0 Stop script script.js.common.anwesenheitsim
12:39:01.616 [info] javascript.0 Start javascript script.js.common.anwesenheitsim
12:39:01.616 [info] javascript.0 script.js.common.anwesenheitsim: registered 2 subscriptions and 5 schedules

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: [Frage] Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 04.09.2017, 07:31

Bin bei dem Thema noch nicht weiter. Das Script macht einfach nichts. Liegt es daran, das ich meine Geräte in Fhem habe?

Benutzeravatar
eric2905
guru
Beiträge: 3290
Registriert: 23.03.2015, 18:41
Wohnort: Wuppertal

Re: [Frage] Wie fange ich an? Komme von Fhem...

Beitrag von eric2905 » 04.09.2017, 07:56

Was passiert denn, wenn Du die Änderungen, die Dein Script machen soll, direkt am jeweiligen Objekt (im Admin, Reiter Objekte) durchführst?

Gruß,
Eric
-----------------------------------------------------------------------------------------------
Roses are red, violets are blue,
if I listen to heavy metal, my neighbours do too

caravandriver
starter
Beiträge: 13
Registriert: 01.02.2017, 10:06

Re: [Frage] Wie fange ich an? Komme von Fhem...

Beitrag von caravandriver » 06.09.2017, 10:17

Habe das nun hinbekommen. Das lag am Haken "Debug"...

Antworten