TimeAlarm mit "If then" verschachteln oder geht es besser?

Kurz zur Erklärung:

Auf den Dachboden kommt eine Steuerzentrale welche per Funk Magnetventile für die Gartenbewässerung ansteuert.
Die Steuerzentrale (ESP 8266 nodeMCU) holt sich seine Zeit selber aus dem Internet über WiFi.
Die Startzeiten sende ich der Zentrale per WiFi vom PC od. Smartphone: http://192.168.100.54/18:00/00:15/4 an ESP Zeiten senden: Anfangszeit 18:00 / Dauer 00:15 / Wiederholung 4

Ziel ist es die 4 Magnetventile nacheinander zu schalten, weil alle zusammen die Pumpe nicht schafft.

Damit auch meine Familie die Bewässerung bedienen kann, schaltet die Zentrale einfach in einer Zeitspanne z.B. von 18-22°° die Sprenger nacheinander auf-zu.
Also z.B. 18°° Sprenger1 an, 18:15 Sprenger2 an...... 19°° Sprenger1 an... in der Zeit 18-22°° 4x jeder Sprenger für 15min an.

Meine Sippe braucht dann nur in dieser Zeitspanne die Pumpe einzuschalten (das schaffen die noch... :grin: )

Ich hoffe: Es kommt einigermaßen verständlich rüber was ich will?! :smiley:

Nun möchte ich die Anfangszeit, Sprengdauer und Wiederholungen per:

http://192.168.100.54/17:00/00:05/8 an ESP Zeiten senden: Anfangszeit 17:00 / Dauer 00:05 / Wiederholung 8

durchaus ändern.

Das wird eine mächtige Verschachtelung mit "if then".

Gibt es Möglichkeiten dies besser zu gestalten?

Basis meines Codes ist der Sketch TimeAlarm. Ich bin noch voll beim "Anpassen"...

/*
 * TimeAlarmExample.pde
 *
 * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
 * and simulates turning lights on at night and off in the morning
 * A weekly timer is set for Saturdays at 8:30:30
 *
 * A timer is called every 15 seconds
 * Another timer is called once only after 10 seconds
 *
 * At startup the time is set to Jan 1 2011  8:29 am
 * 
 * http://192.168.100.54/18:00/00:15/4  an ESP Zeiten senden: Anfangszeit 18:00 / Dauer 00:15 / Wiederholung 4
 */




 
#include <Time.h>
#include <TimeAlarms.h>
#include <ESP8266WiFi.h>

const char* ssid = "SSID";
const char* password = "passwort";

int Ausgangsnummer = 2;         //Ausgangspin für Impuls

bool triggered;
unsigned long previousMillis;







void setup()
{ 
  initWifi();

  //Serial.println(getTime().substring(17, 19));  //Stunden
  //Serial.println(getTime().substring(20, 22));  //Minuten
  int Stunde = (getTime().substring(17, 19)).toInt();
  int Minute = (getTime().substring(20, 22)).toInt();
  
  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  
  // prepare GPIO0
  pinMode(0, OUTPUT);
  digitalWrite(0, HIGH);
  
  
  Serial.begin(115200);

  
  setTime(Stunde+1,Minute,45,1,1,11); // set time to Saturday 8:29:45am Jan 1 2011

}






//Programmschleife
void  loop(){

  // create the alarms
  Alarm.alarmRepeat(20,19,0, MorningAlarm);  // 8:30am every day (SytaxNachm: 17,45,0)
  Alarm.alarmRepeat(8,30,30,EveningAlarm);  // 8:30:30pm every day
  Alarm.alarmOnce(8,30,35,EinmalAlarm);  // 8:30:35pm einmalig 
  Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm);  // 8:30:30 every Saturday 

 
  Alarm.timerRepeat(15, Repeats);            // timer for every 15 seconds    
  Alarm.timerOnce(59, OnceOnly);             // called once after 59 seconds 



    
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display


  //Prozess um Tastenimpuls auszugeben - Aufruf mit trigger();
  if (triggered && (millis() - previousMillis > 100))
  {
    digitalWrite(Ausgangsnummer, HIGH);
    triggered = false;
  }
}







// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("SprengerOst an");
  trigger();    
}







void EveningAlarm(){
  Serial.println("SprengerOst aus");
  Ausgangsnummer = 0;
  trigger();           
}





void EinmalAlarm(){
  Serial.println("Einmal-Alarm");
  Ausgangsnummer = 0;
  trigger();           
}







void WeeklyAlarm(){
  Serial.println("Alarm: - its Monday Morning");      
}







void ExplicitAlarm(){
  Serial.println("Alarm: - this triggers only at the given date and time");       
}







void Repeats(){
  Serial.println("15 second timer");         
}







void OnceOnly(){
  Serial.println("This timer only triggers once");  
}







void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}







void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}






void trigger()
{
  digitalWrite(Ausgangsnummer, LOW);
  triggered = true;
  previousMillis = millis();
}






String getTime() {
  WiFiClient client;
  while (!!!client.connect("heizungsreparatur.de", 80)) {
    Serial.println("connection failed, retrying...");
  }

  client.print("HEAD / HTTP/1.1\r\n\r\n");
 
  while(!!!client.available()) {
     yield();
  }

  while(client.available()){
    if (client.read() == '\n') {    
      if (client.read() == 'D') {    
        if (client.read() == 'a') {    
          if (client.read() == 't') {    
            if (client.read() == 'e') {    
              if (client.read() == ':') {    
                client.read();
                String theDate = client.readStringUntil('\r');
                client.stop();
                return theDate;
              }
            }
          }
        }
      }
    }
  }
}






void initWifi() {
   Serial.print("Connecting to ");
   Serial.print(ssid);
   if (strcmp (WiFi.SSID(),ssid) != 0) {
      WiFi.begin(ssid, password);
   }

   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
  Serial.print("\nWiFi connected, IP address: ");
  Serial.println(WiFi.localIP());
}

Mal sehen ...

Du hast eine Startzeit = 1 Variable
Du hast eine Laufzeit = 1 Variable
Du hast Wiederholungen = 1 Variable

Pseudocode
If Startzeit
for i < Wiederholungen;i++
Funktion Bewässerung(Laufzeit)

So würde ich das jedenfalls angehen. Die Funktion "Bewässerung" wiederum per Timer.lib, das geht ziemlich geschmeidig.

Pseudocode
If Startzeit
for i < Wiederholungen;i++
Funktion Bewässerung(Laufzeit)

Grundregel 1: in loop( ) gehört kein for
Ich vermute mal, deine Funktion Bewässerung(Laufzeit) hängt während der Laufzeit, ohne zurückzukommen ... ;(


Die TimeAlarms.h könnte man sich evtl. mal ansehen. Merkwürdig, dass die Alarme in loop() konfiguriert werden?

Fraglich sehe ich auch, ob du wirklich in setup hängen willst, bis du die http Anfrage bekommen hast, und danach bis zum nächsten Reset Tag um Tag den Regner schalten willst ?

michael_x:
Grundregel 1: in loop( ) gehört kein for

Sowas habe ich neulich doch schon einmal von Dir gelesen. Wieso zur Hölle findest Du das for im Pseudocode nicht gut?!

michael_x:
Die TimeAlarms.h könnte man sich evtl. mal ansehen. Merkwürdig, dass die Alarme in loop() konfiguriert werden?

Fraglich sehe ich auch, ob du wirklich in setup hängen willst, bis du die http Anfrage bekommen hast, und danach bis zum nächsten Reset Tag um Tag den Regner schalten willst ?

Hä?

Gruß

Gregor

Na "alarmRepeat(18,00,0, MorningAlarm);" ist ja schon eine klasse Sache.

Bei 4 Durchläufen 15min Dauer:

alarmRepeat(18,00,0, ErsterSprenger);
alarmRepeat(19,00,0, ErsterSprenger);
alarmRepeat(20,00,0, ErsterSprenger);
alarmRepeat(21,00,0, ErsterSprenger);

alarmRepeat(18,15,0, ZweiterSprenger);
alarmRepeat(19,15,0, ZweiterSprenger);
alarmRepeat(20,15,0, ZweiterSprenger);
alarmRepeat(21,15,0, ZweiterSprenger);
.
.
.
.
alarmRepeat(21,45,0, VierterSprenger);

Problem für mich ist:

Durch die wählbaren Wiederholungen pro Tag z.B.4x (18°°/19°°/20°°/21°°) oder auch z.B.6x (18°°/18:20/18:40/19°°/19:20/19:40) weiß ich nicht so recht wie ich das deklarieren soll.

gregorss:
Sowas habe ich neulich doch schon einmal von Dir gelesen. Wieso zur Hölle findest Du das for im Pseudocode nicht gut?!

Weil das ein blockierender Code ist.
Grüße Uwe

uwefed:
Weil das ein blockierender Code ist.

Blockierender Code mag ja blöd sein. Aber diese (so scheint’s mir) gebetsmühlenartige Wiederholung einer „Grundregel“ ist angesichts von Pseudocode, der ein Prinzip verdeutlichen soll, absolut nicht hilfreich.

Woher stammt das mit dieser „Grundregel“ eigentlich?

Gruß

Gregor

Sowas in der Art:?

for (int z=1; z<=Durchläufe; z++) {
	alarmRepeat(Startzeit,00,0, ErsterSprenger);
	Startzeit=Startzeit+(Durchläufe*Dauer);
}

for (int z=1; z<=Durchläufe; z++) {
	alarmRepeat(Startzeit,00,0, ZweiterSprenger);
	Startzeit=Startzeit+(Durchläufe*Dauer);
}
.
.
.
.
.
.
.

Und das Ganze in einer Funktion verpackt, die ich nur aufrufe wenn vom ESP eine neue Zeiteinstellung empfangen wird? Oder ist das blockierender Code?
Will ja nicht negativ auffallen...

Wie berechne ich Zeit? z.B. 18:00 + 90min?

gregorss:
Blockierender Code mag ja blöd sein. Aber diese (so scheint’s mir) gebetsmühlenartige Wiederholung einer „Grundregel“ ist angesichts von Pseudocode, der ein Prinzip verdeutlichen soll, absolut nicht hilfreich.

Woher stammt das mit dieser „Grundregel“ eigentlich?

Gruß

Gregor

Sie stammt bestimmt aus Erfahrung.

Wiederholen kann mann das nicht oft genug, weil wenn man nicht von Anfang an darauf achtet, blockierungsfrei zu programmieren, hat man es später umso schwerer.

Und Pseudocode soll ja ein Wink in die richtige Richtung sein.

ElEspanol:
Und Pseudocode soll ja ein Wink in die richtige Richtung sein.

Wobei „richtig“ beliebig interpretierbar ist :slight_smile:

Pseudocode verstehe ich so, dass es das Prinzip veranschaulichen soll. Dann mit so einer „Grundregel“ zu kommen, ist Klugscheißerei.

Gruß

Gregor

Danke!

Aber meine Frage lautete anders. :grinning:

&gregorss

Pseudocode verstehe ich so, dass es das Prinzip veranschaulichen soll.

Richtig!
Und wenn im Prinzip schon der Wurm ist....
Dann wirds am Ende nix gutes.

Dann mit so einer „Grundregel" zu kommen, ist Klugscheißerei.

Du magst keine Regeln.
Du möchtest dich keinen Regeln unterwerfen.
Selbst wenn du sie als richtig anerkennst.....

Das ist dein Problem.
Viel Spaß mit diesem Problem...

Ich nenne es nicht Regeln, sondern "Design Pattern".
In diesen Design Pattern stecken Jahrzehnte Erfahrung.
Und natürlich kann mal die Jahrzehnte lange Erfahrung von tausenden Programmieren in den Wind schlagen. Wenn man gute Gründe hat... Aber bei dir sehe ich ein Blockadeverhalten. Ist nicht schlimm, kann jedem passieren. Darf man nur nicht zu weit treiben, dann wirds unheilbar.

Wir können uns gerne über Design Pattern und ihren Sinn unterhalten.
Aber Beschimpfungen und Blockaden sind dann wenig hilfreich.

combie:
Und wenn im Prinzip schon der Wurm ist....
Dann wirds am Ende nix gutes.

Du meinst doch wohl nicht ernsthaft, dass man selbst in Pseudocode auf for-Schleifen verzichten soll?!

Wer mit so einer Grundregelklugscheißerei ankommt, möge mir doch mal den zeigen, der bei Dingen, die man per for-Schleife erledigen kann, ein millis()-Blödsinn eher kapiert als eine for-Schleife. Arduino wurde nicht ohne Grund für Leute entwickelt, die weder Elektroniker noch Informatiker sind.

combie:
Du magst keine Regeln.
Du möchtest dich keinen Regeln unterwerfen.
Selbst wenn du sie als richtig anerkennst.....

Das stimmt nicht.

combie:
Wir können uns gerne über Design Pattern und ihren Sinn unterhalten.
Aber Beschimpfungen und Blockaden sind dann wenig hilfreich.

Ich blockiere nicht und ich beschimpfe auch niemanden. Bitte bleib auf dem Teppich.

Design Patterns sind sicherlich gut. Aber wenn es um Verständlichkeit geht, muss man sich eben verständlch ausdrücken.

Gruß

Gregor

Grundregelklugscheißerei -Blödsinn

Ja das ist verständlich ausgedrückt.
Eine weitere Diskussion erübrigt sich damit auch gleich...

combie:
Eine weitere Diskussion erübrigt sich damit auch gleich...

Da Du nur auf Begriffe aber nicht auf Argumente reagierst, stimme ich zu.

Gruß

Gregor

Argumente?
Die sind dann aber gut in deiner Polemik versteckt...
Ich sehe keine...

Nachtrag:

Du meinst doch wohl nicht ernsthaft, dass man selbst in Pseudocode auf for-Schleifen verzichten soll?!

Aber ganz sicher meine ich genau das!
Wenn im endgültigen Code keine Schleife vorkommen soll, dann darf sie auch nicht im Pseudocode zu finden sein.

und ich beschimpfe auch niemanden.

Sehr wohl tust du das.
Die Verwendung von Klugscheißer und Blödsinn ist herabwürdigend und damit beleidigend.

Klugscheisserei hin oder her ( kann schon sein, hab ich aber kein Prolem damit)

Unter PseudoCode verstehe ich etwas, wo man nicht meckern kann, wenn Semikolons fehlen, statt Klammern Einrückungen gesetzt werden, und ähnliche Sachen.

Pseudocode wie zum Beispiel:

Wenn Taster gedrückt
   Warte 5 Minuten
   Tu was

der dann nicht per delay realisiert werden soll, ist nicht sehr hilfreich, sorry.

Selbst dies:

Wenn Taster gedrückt: setze Startzeit
Wenn Startzeit länger als 5 Minuten vergangen:
    Tu was
    lösche Startzeit

lässt noch viel Raum für Kreativität wie man "lösche Startzeit" realisieren könnte, so dass die Wartebedingung funktioniert (vorher, während und nach der Wartezeit).

Allerdings nehme ich meinen Einwand generell zurück:

  1. Schleifen über 5 Elemente sind immer ok, wenn innerhalb der Schleife keine Wartezeiten sind.

  2. Ein Sketch der als Eingabemedium nur den Reset-Knopf hat, kann natürlich so lange in loop() hängen wie er will. Wahlweise 5 Minuten für eine Beregnungsphase, von 18 bis 22 Uhr, 24 Stunden für ein "Tagesprogramm", oder auch ewig.

Allerdings nehme ich meinen Einwand generell zurück:

Zu 1:
Ja, kurze Schleifen können Sinn machen und auch notwendig sein.

Zu 2:
Das solcherart geschriebene Programm leidet unter der Inselkrankheit.
Und dieses steht einer Wiederverwendung der Einzelteile, oder einer Erweiterung um zusätzliche Abläufe, entgegen.
Ist also nicht zu empfehlen.

combie:
Wenn im endgültigen Code keine Schleife vorkommen soll, dann darf sie auch nicht im Pseudocode zu finden sein.

Dann verstehen wir den Sinn von Pseudocode wohl unterschiedlich. Mach nichts.

combie:
Sehr wohl tust du das. [Beleidigen]
Die Verwendung von Klugscheißer und Blödsinn ist herabwürdigend und damit beleidigend.

Ob solche Begriffe oder Aussagen so empfunden werden, ist eine ziemlich subjektive Angelegenheit (und damit quasi beliebig dehnbar).

Zu 2:
Das solcherart geschriebene Programm leidet unter der Inselkrankheit.

Was meinst Du hier mit Inselkrankheit?

Gruß

Gregor

Dann verstehen wir den Sinn von Pseudocode wohl unterschiedlich.

Das stimmt!
Wobei ich Wikipedia, und viele andere, auf meiner Seite habe.
Und du?

Mach nichts.

Wer Mist erzählt, muss mit Kontra rechnen.

Ob solche Begriffe oder Aussagen so empfunden werden, ist eine ziemlich subjektive Angelegenheit

Und das ist jetzt ein Freibrief für dich, dich reihenweise daneben zu benehmen?
So pflegst du also mit deinen Freunden und Verwandten um zu gehen...
Sind deine Eltern auch so mit dir umgegangen?
Dann ist es kein Wunder, dass du soo drauf bist.
Manoo, du tust mir leid..... (und dein Umfeld in besonderem Maße)
Hoffentlich findest du noch zu einer ausgeglicheneren Persönlichkeit...

Ich möchte dich bitten, das rumkrakeelen hier im Forum, zu unterlassen. Nicht dass das hier einreißt und alle sich gezwungen sehen sich ebenso abartig zu verhalten. Leider ist ein solches Verhalten ansteckend.
Was du Zuhause machst, ist mir dabei recht egal...
Wobei ich es allerdings sehr schade finde, dass du diesem Zwang unterliegst.

Ich wünsche mir hier einen freundlichen und respektvollen Umgang.
Aber das wird dir sicherlich nicht viel sagen....
Wahrscheinlich hast du nicht nur für Pseudocode deine eigene Definition, sondern, so wie es aussieht, auch für freundlich und respektvoll.

Lesestoff: