1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • Text Dateien bearbeiten

    • Oscar
    • 1. Mai 2017 um 15:36
    Zitat von Hilfe

    From a performance standpoint it is a bad idea to read line by line specifying "line" parameter whose value is incrementing by one. This forces AutoIt to reread the file from the beginning until it reach the specified line.

    Dieses Zitat aus der Hilfe sagt eigentlich schon alles.
    FileReadLine auf keinen Fall mit dem Zeilenparameter verwenden, wenn man die ganze Datei durchgehen will!
    Sondern: Die Datei zum lesen öffnen (FileOpen) und mit dem zurückgegebenen Dateihandle die Datei mit FileReadLine($hFile) (ohne Zeilenparameter) durchgehen. Es wird automatisch immer die nächste Zeile verwendet.
    Am Schluß die Datei wieder schließen (FileClose).
    Beim Schreiben genau das Gleiche. Dort könnte man die Datei auch erst im RAM zusammensetzen und dann komplett speichern.

  • StringInStr - Position(en) gesuchten Inhalt in String abfangen (mehrfach)

    • Oscar
    • 20. April 2017 um 09:00

    Es gibt bei StringInStr einen Parameter der sich "start" nennt. Wenn Du dort die zuletzt gefundene Postion (plus 1) einträgst, dann findet der Befehl die nächste Position im String.

  • Ein bestimmtes Wort im Text suchen

    • Oscar
    • 20. April 2017 um 05:08

    @plnpcs: Warum machst Du noch einen Thread auf mit dem gleichen Inhalt?
    Ich habe Dir bereits in: Wenn im Input "Hallo" steht im Output "Hey" stehen lassen die Antwort gegeben.

  • Wenn im Input "Hallo" steht im Output "Hey" stehen lassen

    • Oscar
    • 19. April 2017 um 16:21

    Schau Dir mal StringInStr an.

  • Nutzungsrechte Skripte

    • Oscar
    • 18. April 2017 um 18:47
    Zitat von Candyland

    der Code ist von dritten frei & nicht malicious

    Wer will bzw. kann das überprüfen?
    So eine Überprüfung ist gar nicht machbar. Weder von der Zeit her, noch von der Qualität.

    Es geht hier allein darum, dass Scripte, die ohne Lizenz veröffentlicht werden, eine "freie" Lizenz bekommen sollen (für zukünftig veröffentlichte Scripte).
    Und ich denke, dass der Ansatz sehr gut ist. Wer für sein Script dieses nicht will, der erstellt halt eine entsprechende eigene Lizenz.

    Daraus abzuleiten, dass wir nur Scripte zulassen, die funktionstüchtig und fehler-/virenfrei, sowie frei von Rechten Dritter sind, ist schlicht unmöglich.

    Natürlich werden wir tätig und löschen Scripte, wenn sich herausstellt, dass diese Viren, Bots oder ähnliches enthalten, aber das generell vorher überprüfen zu wollen, ist eine Mamutaufgabe.

  • User Musashi möchte sich vorstellen

    • Oscar
    • 17. April 2017 um 12:38

    Auch von mir ein: Herzlich Willkommen!

    Schreibe Gun-Food eine PN. Er schickt Dir dann seine Kontodaten.
    Das habe ich selbst schon gemacht, weil ich PayPal ebenfalls ablehne.

  • Wer hat eigentlich die "Rechte" an veröffentlichen Skripten?

    • Oscar
    • 16. April 2017 um 19:30

    Um mit einem Script unter den Schutz des Urheberrechts zu kommen, muss man erstmal die "Schöpfungshöhe" erreichen.
    Jedem dürfte klar sein, dass ein "Hello World" sicherlich keinen Schutz geniessen wird.
    Wo aber genau die Grenze verläuft, kann ich auch nicht sagen. Dazu wird es vermutlich hunderte von Gerichtsurteilen geben.

    Auf das Forum angewandt, würde ich sagen (persönliche Meinung ohne juristischen Hintergrund), dass die meisten kleinen UDFs wohl diese Schöpfungshöhe nicht erreichen werden.
    Bei UDFs, die hier im Forum veröffentlicht werden, will der Autor ja auch, dass sie von anderen benutzt werden.
    Bei umfangreichen Scripten, so sie denn als Script hier veröffentlicht wurden, sollte man aber schon auf eine evtl. vorhandene Lizenz achten.

  • _GetSunriseAndSunset zum berechnen von Sonnenaufgang und Sonnenuntergang

    • Oscar
    • 11. April 2017 um 13:13

    Hier ist eine kleine Funktion zum berechnen von Sonnenaufgang und Sonnenuntergang.
    Als "Nebenprodukt" enstanden dann noch Funktionen für das Schaltjahr und die Sommerzeit.
    Vielleicht kann das ja noch jemand gebrauchen.

    AutoIt
    Global $iLat = 52.39 ; Breitengrad
    Global $iLon = 9.973 ; Laengengrad
    Global $iTimezone = 1 ; Zeitzone UTC = 0, MEZ = 1 (Sommerzeit wird berechnet)
    Global $iYear = 2017
    Global $iMonth = 4
    Global $iDay = 11
    ConsoleWrite('Datum: ' & StringFormat('%02d.%02d.%04d', $iDay, $iMonth, $iYear) & @CR)
    ConsoleWrite('Schaltjahr: ' & (_IsLeapyear($iYear) ? 'Ja' : 'Nein') & @CR)
    ConsoleWrite('Sommerzeit (MESZ): ' & _MEZ_SummertimeDate($iYear, 3) & ' - ' & _MEZ_SummertimeDate($iYear, 10) & @CR)
    Global $sun = _GetSunriseAndSunset($iLat, $iLon, $iTimezone, $iYear, $iMonth, $iDay)
    ConsoleWrite('Sonnenaufgang und Sonnenuntergang: ' & $sun & @CR)
    
    
    ; Gibt den Sonnenaufgang und den Sonnenuntergang zu den uebergebenen Daten zurueck
    ; Der Breitengrad sollte zwischen -65 und 65 Grad liegen! Ansonsten ist die Formel zu ungenau.
    ; Der Fehler dieser recht einfachen Formel liegt bei +/- 5 Minuten.
    ; Die Formel stammt von: "http://lexikon.astronomie.info/zeitgleichung/"
    ; Author: Oscar (www.autoit.de)
    Func _GetSunriseAndSunset($iLat, $iLon, $iTimezone, $iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
    	Local Const $PI = 4 * ATan(1) ; PI berechnen
    	Local Const $RAD = $PI / 180 ; Umrechnungsformel in Radians (Bogenmass)
    	Local $B = $iLat * $RAD ; Breitengrad in RAD umrechnen
    	Local $L = $iLon ; Laengengrad !nicht! in RAD umrechnen
    	Local $iHours = $iTimezone + _MEZ_SummertimeHour($iYear, $iMonth, $iDay, 4, $iTimezone) ; Zeitzone und MEZ-Sommerzeit addieren
    	Local $T = _GetDayNumber($iYear, $iMonth, $iDay) ; Anzahl der Tage berechnen
    	Local $h = -50 / 60 * $RAD ; Aufgrund der Lichtbeugung der Athmosphaere wird mit einer geometrischen Horizonthoehe von -50 Bogenminuten gerechnet
    	Local $dk = 0.4095 * Sin(0.016906 * ($T - 80.086)) ; Deklination der Sonne (in RAD)
    	Local $tDiff = 12.0 * ACos((Sin($h) - Sin($B) * Sin($dk)) / (Cos($B) * Cos($dk))) / $PI ; Zeitdifferenz vom wahren Mittag bis zur Horizonthoehe (in Stunden)
    	Local $tEqual = -0.171 * Sin(0.0337 * $T + 0.465) - 0.1299 * Sin(0.01787 * $T - 0.168) ; Zeitgleichung (wahre Ortszeit - mittlere Ortszeit)
    	Local $sunrise = (12 - $tDiff - $tEqual) + -($L / 15) + $iHours ; Sonnenaufgang (in Stunden, Kommazahl)
    	Local $sunset = (12 + $tDiff - $tEqual) + -($L / 15) + $iHours ; Sonnenuntergang (in Stunden, Kommazahl)
    	$sunrise = StringFormat('%02d:%02d Uhr', Int($sunrise), Int(($sunrise - Int($sunrise)) * 60)) ; umrechnen in HH:MM
    	$sunset = StringFormat('%02d:%02d Uhr', Int($sunset), Int(($sunset - Int($sunset)) * 60)) ; umrechnen in HH:MM
    	Return $sunrise & ' - ' & $sunset
    EndFunc   ;==>_GetSunriseAndSunset
    
    
    ; Gibt die Anzahl der Tage (Tag des Jahres) zurueck
    ; Author: Oscar (www.autoit.de)
    Func _GetDayNumber($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
    	Local Const $aMdays[] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    	Local $d = $iDay + ($iMonth >= 2 And _IsLeapyear($iYear))
    	For $i = 1 To $iMonth - 1
    		$d += $aMdays[$i - 1]
    	Next
    	Return $d
    EndFunc   ;==>_GetDayNumber
    
    
    ; Schaltjahrberechnung (true = Schaltjahr, false = kein Schaltjahr)
    ; Author: Oscar (www.autoit.de)
    Func _IsLeapyear($iYear = @YEAR)
    	Return Not Mod($iYear, 4) And (Mod($iYear, 100) Or Not Mod($iYear, 400))
    EndFunc   ;==>_IsLeapyear
    
    
    ; Gibt eine 1 zurueck, wenn das uebergebene Datum/Uhrzeit in die Sommerzeit faellt
    ; in C++ von "jurs" aus dem deutschen Arduino Forum ("http://forum.arduino.cc/index.php?board=31.0")
    ; Author: Oscar (www.autoit.de)
    Func _MEZ_SummertimeHour($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY, $iHour = @HOUR, $iTimezone = 1)
    	If $iMonth < 3 Or $iMonth > 10 Then Return 0 ; keine Sommerzeit im Jan, Feb, Nov, Dez
    	If $iMonth > 3 And $iMonth < 10 Then Return 1 ; Sommerzeit im Apr, Mai, Jun, Jul, Aug, Sep
    	Local $iBegin = 31 - Int(Mod(5 * $iYear / 4 + 4, 7)) ; Tag des Sommerzeitanfangs
    	Local $iEnd = 31 - Int(Mod(5 * $iYear / 4 + 1, 7)) ; Tag des Sommerzeitendes
    	If ($iMonth = 3 And ($iHour + 24 * $iDay) >= (1 + $iTimezone + 24 * $iBegin)) Or _
    			($iMonth = 10 And ($iHour + 24 * $iDay) < (1 + $iTimezone + 24 * $iEnd)) Then
    		Return 1
    	Else
    		Return 0
    	EndIf
    EndFunc   ;==>_MEZ_SummertimeHour
    
    
    ; Gibt den letzten Sonntag im Maerz (Sommerzeitanfang) oder den letzten Sonntag im Oktober (Sommerzeitende) zurueck
    ; Author: Oscar (www.autoit.de)
    Func _MEZ_SummertimeDate($iYear = @YEAR, $iMonth = 3)
    	Local $iDay = 0
    	Switch $iMonth
    		Case 3 ; wenn der Maerz als Monat uebergeben wurde
    			$iDay = 31 - Int(Mod(5 * $iYear / 4 + 4, 7)) ; Tag des Sommerzeitanfangs
    		Case 10 ; wenn der Oktober als Monat uebergeben wurde
    			$iDay = 31 - Int(Mod(5 * $iYear / 4 + 1, 7)) ; Tag des Sommerzeitendes
    		Case Else
    			Return SetError(1, 0, 'error')
    	EndSwitch
    	Return StringFormat('%02d.%02d.%04d', $iDay, $iMonth, $iYear)
    EndFunc   ;==>_MEZ_SummertimeDate
    Alles anzeigen

    Die Ausgabe sieht dann so aus:

    Code
    Datum: 11.04.2017
    Schaltjahr: Nein
    Sommerzeit (MESZ): 26.03.2017 - 29.10.2017
    Sonnenaufgang und Sonnenuntergang: 06:32 Uhr - 20:09 Uhr

    Dateien

    _GetSunriseAndSunset.au3 4,81 kB – 609 Downloads
  • SerialComm.au3 (eine kleine UDF zum Datenaustausch mit dem Arduino)

    • Oscar
    • 9. April 2017 um 19:30

    Nachtrag: auf Arduino-Seite habe ich das Serial.flush(); vergessen. Also nach jedem Serial.write(); bzw. Serial.print(); noch ein Serial.flush(); einfügen. Damit werden die Daten sofort gesendet und nicht erst, wenn der Buffer voll ist bzw. der Timeout eintritt.

  • Arduino GPS-Wetterstation

    • Oscar
    • 9. April 2017 um 19:20

    Ich will mal vom fortschreiten des Projekts berichten.

    Zuerst ein Rückschlag: den GPS-Empfänger habe ich wieder ausgebaut. Tagsüber war der Empfang in der Wohnung ok, aber abends (mit heruntergelassenen Rolläden) war der Empfang oft gestört und merkwürdigerweise meldet die Library, dass sie eine "korrekte" Uhrzeit empfangen hat. Damit wurde mir dann die RTC verstellt. Das wurde zwar wieder korrigiert, wenn tatsächlich die korrekte Uhrzeit empfangen wurde, aber wenn der Fehler genau um Mitternacht passiert (da schreibe ich die Tagesdaten auf die SD-Karte), wurden die Daten nicht geschrieben. Bis ich den Fehler gefunden hatte, ist viel Zeit für's Debugging drauf gegangen.
    Im Prinzip war der GPS-Empfänger ja sowieso Spielerei in dem Projekt und durch den Verzicht auf die GPS-Daten habe ich jetzt Platz auf dem TFT für die Daten vom Wind- und Regensensor.

    In meinem Elegoo-Starterkit habe ich noch so einen Feuchtigkeitssensor gefunden:

    Den habe ich jetzt noch an meiner Aussenstation befestigt, um feststellen zu können, ob es jetzt gerade regnet bzw. um auch kleine Niederschlagsmengen registrieren zu können. Der Regen-Aussensensor (aus Post#3) registriert ja erst Regenmengen ab 0.25 l/m2. Mit diesen beiden Sensoren habe ich jetzt eine bessere Niederschlagsaufzeichnung.

    Die Sommerzeit-Umstellung im Arduino Mega findet nun auch automatisch statt. Wobei ich nicht die RTC verstelle, sondern nur eine Stunde bei der Anzeige addiere.
    Ich muss mir nur noch etwas einfallen lassen, wie ich mit den fehlenden, bzw. bei der Winterzeit-Umstellung mit den zusätzlichen, Daten umgehe. Genaugenommen habe ich es für die Arduino-Seite schon geklärt: ich speichere einfach bis zu 25 Stunden an Daten. Damit bleibt dann nur die Auswertung auf dem PC. Bei der Sommerzeit-Umstellung würden die Daten von einer Stunde fehlen (könnte man leerlassen), aber bei der Winterzeit-Umstellung gibt es die Daten von 2-3 Uhr doppelt. Da weiß ich noch nicht, wie ich das handhaben werde...

    Als zusätzliche Anzeige habe ich jetzt noch ein Icon für die Jahreszeit (Frühling, Sommer, Herbst und Winter) auf dem TFT vorgesehen. Das Icon wird dann anhand der astronomischen Daten (nur taggenau) geändert.

    Das AutoIt-Script ist immer noch "in Arbeit", also noch nichts, was ich hier veröffentlichen möchte.
    Ich habe jetzt aber die Innen- und Außentemperatur sowie die Helligkeits- und die Regenmenge auf jeweils eine Grafik gebracht. Hier mal die Grafiken von heute:
    20170409_Temperatur.png
    Die blaue Kurve stellt die Außentemperatur dar und die orange Kurve die Innentemperatur. Wobei ich anmerken muss, dass der Sensor nach Westen hin ausgerichtet und so ab ca. halb zwei der direkten Sonneneinstrahlung ausgesetzt ist.
    20170409_Sonneneinstrahlung.png
    Das sieht man auch an dieser Kurve sehr schön. Die Helligkeit steigt ab halb Zwei drastisch an. Einen Wert von über 60.000 Lux (das ist ein 10min-Mittelwert) hatte ich hier bisher nicht gemessen. Die blaue Linie würde die Niederschlagsmenge anzeigen. Gab es heute aber nicht. :D

  • SerialComm.au3 (eine kleine UDF zum Datenaustausch mit dem Arduino)

    • Oscar
    • 8. April 2017 um 16:08

    Es gibt zwar schon einige UDFs, die sich mit der seriellen Schnittstelle befassen, aber ich wollte eine kleine und vor allem einfache UDF für den Datenaustausch (AutoIt <-> Arduino).
    Man kommt da schon mit wenigen Befehlen aus (Open, Close, Send, Receive). Da sind die anderen UDFs schon viel zu "overkill". ^^
    Im Anhang befindet sich die UDF, die man lediglich in sein Script includen muss.

    Hier mal das Beispiel für den Arduino:

    C
    char CommandBuffer[6];
    const char Command1[] = "GetAdd";
    const char Command2[] = "LEDoff";
    const char Command3[] = "LEDon ";
    
    
    struct tAddress {
      byte Nummer;
      char Name[20];
      char Strasse[20];
      char PLZ[5];
      char Wohnort[20];
      byte Alter;
    };
    
    
    struct tAddress Address;
    
    
    void setup() {
      Serial.begin(230400);
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, LOW);
    
    
      // Struktur mit Beispieldaten fuellen
      Address.Nummer = 1;
      strcpy(Address.Name, "Alfons Meier");
      strcpy(Address.Strasse, "Koenigstr. 10");
      strcpy(Address.PLZ, "45678");
      strcpy(Address.Wohnort, "Bellhausen");
      Address.Alter = 42;
    }
    
    
    void loop() {
      if (Serial.available()) {
        Serial.readBytes(CommandBuffer, sizeof(CommandBuffer));
        if (strncmp(CommandBuffer, Command1, 6) == 0) {
          Serial.write((byte*)&Address, sizeof(Address));
          Serial.flush();
        }
        if (strncmp(CommandBuffer, Command2, 6) == 0) {
            digitalWrite(LED_BUILTIN, LOW);
            Serial.write(Command2);
            Serial.flush();
        }
        if (strncmp(CommandBuffer, Command3, 6) == 0) {
            digitalWrite(LED_BUILTIN, HIGH);
            Serial.write(Command3);
            Serial.flush();
        }
      }
    }
    Alles anzeigen


    Und das AutoIt-Beispiel-Script:

    AutoIt
    #include "SerialComm.au3"
    
    
    Global $hPort = _SerialCommOpenPort('COM4', 1000, 115200) ; den seriellen Port oeffnen
    If @error Then Exit ConsoleWrite('Fehler Nr.: ' & @error & @CR)
    
    
    MsgBox(0, 'Test', 'Beispiel 1:' & @CRLF & 'Eine Datenstruktur wird vom Arduino empfangen.')
    
    
    Global $iTimer, $iBytes, $tSend, $tReceive
    
    
    ; Beispiel 1: Es wird "GetAdd" an den Arduino gesendet und dieser sendet dann eine Struktur an Daten zurueck
    
    
    Global Const $tagADDRESS = 'struct;' & _ ; in dieser Form werden die Daten empfangen (die gleiche Struktur wie beim Arduino)
    		'byte Nummer;' & _
    		'char Name[20];' & _
    		'char Strasse[20];' & _
    		'char PLZ[5];' & _
    		'char Wohnort[20];' & _
    		'byte Alter;' & _
    		'endstruct'
    $tReceive = DllStructCreate($tagADDRESS) ; den Empfangspuffer (67 Byte) erstellen
    
    
    $tSend = DllStructCreate('byte[6]') ; Sendepuffer erstellen (der Arduino erwartet ein 6 Byte langes Kommando)
    DllStructSetData($tSend, 1, 'GetAdd') ; das Kommando "GetAdd" in den Sendepuffer schreiben
    $iTimer = TimerInit()
    $iBytes = _SerialCommSendData($hPort, $tSend) ; und an den Arduino senden
    ConsoleWrite('Zeit  (gesendet) : ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
    
    
    $iTimer = TimerInit()
    $iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Daten werden empfangen
    ConsoleWrite('Zeit  (empfangen): ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Nummer') & '"' & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Name') & '"' & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Strasse') & '"' & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'PLZ') & '"' & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Wohnort') & '"' & @CR)
    ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Alter') & '"' & @CR)
    ; die Strukturen loeschen
    $tSend = 0
    $tReceive = 0
    
    
    MsgBox(0, 'Test', 'Weiter mit Beispiel 2:' & @CRLF & 'Die Onboard-LED des Arduino blinkt 10 mal.')
    
    
    ; Beispiel 2: es werden abwechselnd immer LEDon und LEDoff als Kommando an den Arduino gesendet
    
    
    $tSend = DllStructCreate('byte[6]') ; Sendepuffer erstellen (der Arduino erwartet ein 6 Byte langes Kommando)
    $tReceive = DllStructCreate('byte[6]') ; Empfangspuffer erstellen (der Arduino sendet eine 6 Byte lange Bestaetigung zurueck)
    
    
    For $i = 0 To 9
    
    
    	DllStructSetData($tSend, 1, 'LEDon ') ; das Kommando zum einschalten der LED in den Sendepuffer schreiben
    	$iTimer = TimerInit()
    	$iBytes = _SerialCommSendData($hPort, $tSend) ; das Kommando senden
    	ConsoleWrite('Zeit  (gesendet) : ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    	ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
    
    
    	$iTimer = TimerInit()
    	$iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Bestaetigung vom Arduino empfangen
    	ConsoleWrite('Zeit  (empfangen): ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    	ConsoleWrite('Daten (empfangen): "' & BinaryToString(DllStructGetData($tReceive, 1)) & '"' & @CR & @CR)
    
    
    	Sleep(250)
    
    
    	DllStructSetData($tSend, 1, 'LEDoff'); das Kommando zum ausschalten der LED in den Sendepuffer schreiben
    	$iTimer = TimerInit()
    	$iBytes = _SerialCommSendData($hPort, $tSend) ; das Kommando senden
    	ConsoleWrite('Zeit  (gesendet) : ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    	ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
    
    
    	$iTimer = TimerInit()
    	$iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Bestaetigung vom Arduino empfangen
    	ConsoleWrite('Zeit  (empfangen): ' & Round(TimerDiff($iTimer), 3) & '  Bytes: ' & $iBytes & @CR)
    	ConsoleWrite('Daten (empfangen): "' & BinaryToString(DllStructGetData($tReceive, 1)) & '"' & @CR & @CR)
    
    
    	Sleep(250)
    Next
    ; die Strukturen loeschen
    $tSend = 0
    $tReceive = 0
    
    
    _SerialCommClosePort($hPort)
    Alles anzeigen

    Dateien

    _SerialComm.zip 3,04 kB – 526 Downloads Arduino-AutoIt.zip 728 Byte – 472 Downloads
  • Den im Input eingegebenen Text als Hotkey verwenden

    • Oscar
    • 5. April 2017 um 19:37
    Zitat von autoiter

    sondern die Scham davor, euch meinen Dreckscode zu zeigen

    Dieses Argument kann ich nicht nachvollziehen.
    Es ist doch "normal", dass man am Anfang nicht den saubersten Code schreibt.
    Gerade dann sollte man seinen Code posten, damit wir Anderen demjenigen zeigen können, wie man es richtig/besser machen kann.

  • Jahreszeit ausgeben

    • Oscar
    • 5. April 2017 um 13:32

    Ich habe jetzt das neue Script hinzugefügt (Post#1).
    Die Ergebnisse sind deutlich genauer. Ich denke, dass das für die meisten Zwecke reichen wird. :)

  • Rechtslage Javascript nach AutoIt portiert

    • Oscar
    • 5. April 2017 um 11:35

    Ich habe mittlerweile noch im Internet gesucht und da gab es sogar schon Gerichtsurteile, die eine Klage abgewiesen haben, wo Javascripte direkt kopiert und auf der eigenen Homepage eingesetzt wurden.
    Mit der Begründung, dass das Script schon etwas Besonders darstellen muss und es nicht zur Routinearbeit eines Programmierers gehört.
    Ich denke, dass das portieren von Formeln durchaus eine Routinearbeit eines Programmieres ist. Also wird das wohl legal sein.
    Danke trotzdem für eure Einschätzung!

  • _StringBetween (TextInhalte von definierten Bereich bis zur Ende lesen ODER von Anfang bis zum definierten Bereich)

    • Oscar
    • 5. April 2017 um 11:21

    Einen bestimmten (z.B. von Zeichen 11 bis Zeichen 18) Stringabschnitt kann man mit StringMid extrahieren.
    Ist der String dynamisch (also unterschiedlich lang und nicht immer an der gleichen Stelle) kommt man mit RegExp weiter.
    Um Dir aber mit einem geeigneten Pattern helfen zu können, brauchen wir den ganzen Text und eine genaue Angabe, was Du davon benötigst.

  • Rechtslage Javascript nach AutoIt portiert

    • Oscar
    • 5. April 2017 um 06:45

    Es handelt sich zwar um 5 Funktionen, diese enthalten aber ausschließlich Wertzuweisungen zu den Variablen und Formeln zur Berechnung der Jahreszeiten.
    Das heißt, es gibt noch eine Tabelle mit Daten zu den deltaT-Werten zur Umrechnung von TDT in UTC, aber diese Werte gibt es auch auf der Seite der Navy (frei im Internet abrufbar).
    Das müsste doch eigentlich legal sein, oder?

  • Rechtslage Javascript nach AutoIt portiert

    • Oscar
    • 4. April 2017 um 19:08

    Weiß jemand, wie das rechtlich aussieht, wenn man ein Javascript nach AutoIt portiert?
    Konkret geht es um ein Script zur Berechnung der Jahreszeiten. Bereits im Javascript befinden sich zahlreiche Formeln aus einem Buch ("Astronomical Algorithms").
    Die Funktionen mit den Formeln habe ich nach AutoIt portiert. Darf ich das AutoIt-Script dann veröffentlichen?

  • Jahreszeit ausgeben

    • Oscar
    • 3. April 2017 um 16:12

    Nun, zum Einen sind die Zeiten in meinem Script UTC-Zeiten (also -1 bzw. -2 Stunden).
    Zum Anderen sind sie nicht minutengenau, weil ich die Zeiten (in Tagen) aus der Tabelle von der Seite in Sekunden umgerechnet habe. Bei nur 2 Stellen hinterm Komma wird das nicht so genau.
    Leider habe ich keine andere Quelle für genauere Daten gefunden.

  • Jahreszeit ausgeben

    • Oscar
    • 3. April 2017 um 15:24

    Ich habe die Funktion noch etwas geändert, damit man sich auch den Beginn der vier Jahreszeiten eines Jahres ausgeben lassen kann.
    Beispiel dazu befindet sich im Script.

  • Jahreszeit ausgeben

    • Oscar
    • 2. April 2017 um 19:05

    Ich brauchte ein Script, dass einem die Jahreszeit (Frühling, Sommer, Herbst und Winter) zu einem Datum ausgibt.
    Und weil ich sowas nicht gefunden habe, habe ich es halt selbst geschrieben. ^^
    Falls das noch jemand gebrauchen kann:

    AutoIt
    #include <Array.au3>
    #include <Date.au3>
    
    
    ; Beispiel fuer die Rueckgabe der Jahreszeit zu einem Datum
    Global $sDate = '2017/04/03 00:00:00'
    MsgBox(0, 'Jahreszeit', 'Gesuchtes Datum: ' & @CRLF & $sDate & ' -> ' & _GetSeason(1, $sDate))
    
    
    
    
    ; Beispiel fuer die Auflistung wann die Jahreszeiten in einem Jahr beginnen
    Global Const $sEPOCH = '1970/01/01 00:00:00'
    Global $sDate = '2017/12/31 00:00:00' ; <- Startdatum muss der 31. Dezember des gesuchten Jahres sein
    Global $aSeasonDate[4][2]
    
    
    For $i = 3 To 0 Step -1
    	$aSeasonDate[$i][0] = _GetSeason(1, $sDate) ; die Funktion gibt den Jahreszeitnamen zurueck
    	$sDate = _DateAdd('s', @extended, $sEPOCH) ; @extended enthält den Anfang der Jahreszeit (in Unixzeit)
    	$aSeasonDate[$i][1] = $sDate
    Next
    _ArrayDisplay($aSeasonDate, 'Jahreszeiten ' & StringLeft($sDate, 4) + 1, '', 16 + 64, '|', 'Jahreszeit|Anfang')
    
    
    
    
    ;===============================================================================
    ; Function Name:   _GetSeason([$iLanguage][, $sDate])
    ; Description:     Gibt die Jahreszeit zurueck von einem uebergebenen Datum (nur fuer die Jahre zwischen 2000 und 3000 moeglich)
    ; Parameter(s):    $iLanguage = 0 (Englisch) oder 1 (Deutsch)
    ;                  $sDate = Datum und Uhrzeit im Format: 'YYYY/MM/DD[ hh:mm:ss]'
    ; Requirement(s):  ---
    ; Return Value(s): den Namen der Jahreszeit und als @extended den Anfang der Jahreszeit (in Unixzeit)
    ; Author(s):       Oscar (www.autoit.de)
    ;===============================================================================
    Func _GetSeason($iLanguage = 0, $sDate = _NowCalc())
    	If Not _DateIsValid($sDate) Then Return SetError(1, 0, 'error')
    	Local Const $aSEASONNAMES[2][4] = [ _ ; die Jahreszeiten-Namen in Englisch (0) und Deutsch (1)
    			['Spring', 'Summer', 'Autumn', 'Winter'], _
    			['Frühling', 'Sommer', 'Herbst', 'Winter']]
    	If $iLanguage < 0 Or $iLanguage >= UBound($aSEASONNAMES) Then $iLanguage = 0
    	If StringLeft($sDate, 4) < 2000 Or StringLeft($sDate, 4) > 3000 Then Return SetError(2, 0, 'error') ; die Sekunden pro Jahreszeit gelten nur fuer die Jahre zwischen 2000 und 3000
    	Local Const $aSEASONTICKS[4] = [8014464, 8091360, 7762176, 7688736] ; Sekunden pro Jahreszeit (Fruehling, Sommer, Herbst, Winter)
    	Local Const $sEPOCH = '1970/01/01 00:00:00'
    	Local $iStart = _DateDiff('s', $sEPOCH, '2000/03/20 08:35:00') ; Unixzeit vom Fruehlingsanfang im Jahr 2000 -> '2000/03/20 08:35:00'
    	Local $iSeasonCount = 0 ; Fruehlingsanfang als Start-Jahreszeit
    	Local $iDate = _DateDiff('s', $sEPOCH, $sDate) ; Unixzeit vom gesuchten Datum
    	If $iDate < $iStart Then Return SetError(3, 0, 'error') ; kein Datum vor Fruehlingsanfang 2000 erlaubt
    	While $iStart + $aSEASONTICKS[$iSeasonCount] < $iDate ; die Schleife solange durchlaufen bis das gesuchte Datum erreicht ist
    		$iStart += $aSEASONTICKS[$iSeasonCount] ; zu der Start-Unixzeit die Sekunden der Jahreszeit addieren
    		$iSeasonCount += 1 ; die naechste Jahreszeit
    		If $iSeasonCount > 3 Then $iSeasonCount = 0 ; wenn der Winter addiert wurde, dann wieder mit Fruehling fortfahren
    	WEnd
    	Return SetError(0, $iStart, $aSEASONNAMES[$iLanguage][$iSeasonCount]) ; Jahreszeit zurueckgeben
    EndFunc   ;==>_GetSeason
    Alles anzeigen


    Edit: Das obige Script ist nicht so genau, wenn es um die Uhrzeit der Jahreszeiten-Anfänge geht. Das hängt mit der einfachen Berechnung für die Jahreszeiten-Länge zusammen.
    Ich habe aber noch eine andere Berechnung im Internet gefunden und diese nach AutoIt portiert. Damit liegt die Genauigkeit bei +/- 30 Sekunden.

    Und das Script ("_CalcSeason.au3", im Anhang) sieht so aus:


    AutoIt
    #include <Array.au3>
    #include <Date.au3>
    
    
    Global $iYear = 2017 ; <- das Jahr, dessen Jahreszeiten berechnet werden soll
    Global $UTC, $LocalTime, $aSeasons[4][3] = [['Frühling', '', ''], ['Sommer', '', ''], ['Herbst', '', ''], ['Winter', '', '']]
    For $iSeason = 0 To 3 ; die 4 Jahreszeiten durchgehen
    	$UTC = _calcEquiSol($iSeason, $iYear) ; die Jahreszeit berechnen (UTC)
    	$LocalTime = _UTCtoLocalTime($UTC, False) ; ohne Formatierung in die Lokalzeit umwandeln
    	$aSeasons[$iSeason][1] = $LocalTime
    ;~ 	ConsoleWrite('>> ' & $LocalTime & @CR)
    	$LocalTime = _UTCtoLocalTime($UTC, True) ; mit Formatierung in die Lokalzeit umwandeln
    	$aSeasons[$iSeason][2] = $LocalTime
    ;~ 	ConsoleWrite('-> ' & $LocalTime & @CR)
    Next
    _ArrayDisplay($aSeasons, 'Jahreszeiten ' & $iYear, '', 16 + 64, Default, ' |ohne Format|mit Format')
    
    
    ; Author: Oscar (www.autoit.de)
    Func _UTCtoLocalTime($UTC, $fFormat = False)
    	Local $aDate, $aTime
    	_DateTimeSplit($UTC, $aDate, $aTime) ; UTC aufsplitten
    	Local $tSystem = _Date_Time_EncodeSystemTime($aDate[2], $aDate[3], $aDate[1], $aTime[1], $aTime[2], $aTime[3]) ; in Systemzeit umwandeln
    	Local $tLocal = _Date_Time_SystemTimeToTzSpecificLocalTime($tSystem) ; Zeitzone + Sommerzeit beruecksichtigen
    	Local $sLocalTime = _Date_Time_SystemTimeToDateTimeStr($tLocal, 1) ; ins Format "yyyy/mm/dd hh:mm:ss"
    	If Not $fFormat Then Return $sLocalTime ; wenn keine formatierte Ausgabe gewuenscht, dann so zurueckgeben
    	_DateTimeSplit($sLocalTime, $aDate, $aTime) ; ansonsten Lokalzeit aufsplitten
    	Local $iWeekday = _DateToDayOfWeek($aDate[1], $aDate[2], $aDate[3]) ; Wochentag berechnen
    	Return _DateDayOfWeek($iWeekday, 3) & '. ' & _DateTimeFormat($sLocalTime, 0) ; und formatiert zurueckgeben
    EndFunc   ;==>_UTCtoLocalTime
    
    
    
    
    ; die folgenden Funktionen habe ich von Javascript nach AutoIt uebersetzt
    ; die Javascript-Funktionen stammen von "http://stellafane.org/misc/equinox.html"
    ;
    ; -----Calculate a single event for a single year (Either a Equiniox or Solstice)--------
    ; Meeus Astronmical Algorithms Chapter 27
    Func _calcEquiSol($season, $year)
    	Local Const $PI = 3.14159265358979, $fDegToRad = $PI / 180
    	Local $JDE0 = _calcInitial($season, $year) ; Initial estimate of date of event
    	Local $T = ($JDE0 - 2451545) / 36525
    	Local $W = 35999.373 * $T - 2.47
    	Local $dL = 1 + 0.0334 * Cos($W * $fDegToRad) + 0.0007 * Cos((2 * $W) * $fDegToRad)
    	Local $S = _periodic24($T)
    	Local $JDE = $JDE0 + ((0.00001 * $S) / $dL) ; This is the answer in Julian Emphemeris Days
    	Local $TDT = _fromJDtoTDT($JDE) ; Convert Julian Days to TDT at this format "yyyy/mm/dd hh:mm:ss"
    	Local $UTC = _fromTDTtoUTC($TDT) ; Convert TDT to UTC at this format "yyyy/mm/dd hh:mm:ss"
    	Return $UTC
    EndFunc   ;==>_calcEquiSol
    
    
    ; -----Calculate an initial guess as the JD of the Equinox or Solstice of a Given Year
    ; Meeus Astronmical Algorithms Chapter 27
    Func _calcInitial($season, $year) ; Valid for years 1000 to 3000
    	Local Enum $Spring, $Summer, $Autumn, $Winter
    	Local $JDE = 0, $Y = ($year - 2000) / 1000
    	Switch $season
    		Case $Spring
    			$JDE = 2451623.80984 + 365242.37404 * $Y + 0.05169 * $Y ^ 2 - 0.00411 * $Y ^ 3 - 0.00057 * $Y ^ 4
    		Case $Summer
    			$JDE = 2451716.56767 + 365241.62603 * $Y + 0.00325 * $Y ^ 2 + 0.00888 * $Y ^ 3 - 0.00030 * $Y ^ 4
    		Case $Autumn
    			$JDE = 2451810.21715 + 365242.01767 * $Y - 0.11575 * $Y ^ 2 + 0.00337 * $Y ^ 3 + 0.00078 * $Y ^ 4
    		Case $Winter
    			$JDE = 2451900.05952 + 365242.74049 * $Y - 0.06223 * $Y ^ 2 - 0.00823 * $Y ^ 3 + 0.00032 * $Y ^ 4
    	EndSwitch
    	Return $JDE
    EndFunc   ;==>_calcInitial
    
    
    ; -----Calculate 24 Periodic Terms----------------------------------------------------
    ; Meeus Astronmical Algorithms Chapter 27
    Func _periodic24($T)
    	Local Const $PI = 3.14159265358979, $fDegToRad = $PI / 180
    	Local $A[] = [485, 203, 199, 182, 156, 136, 77, 74, 70, 58, 52, 50, 45, 44, 29, 18, 17, 16, 14, 12, 12, 12, 9, 8]
    	Local $B[] = [324.96, 337.23, 342.08, 27.85, 73.14, 171.52, 222.54, 296.72, 243.58, 119.81, 297.17, 21.02, 247.54, 325.15, 60.93, 155.12, 288.79, 198.04, 199.76, 95.39, 287.11, 320.81, 227.73, 15.45]
    	Local $C[] = [1934.136, 32964.467, 20.186, 445267.112, 45036.886, 22518.443, 65928.934, 3034.906, 9037.513, 33718.147, 150.678, 2281.226, 29929.562, 31555.956, 4443.417, 67555.328, 4562.452, 62894.029, 31436.921, 14577.848, 31931.756, 34777.259, 1222.114, 16859.074]
    	Local $S = 0
    	For $i = 0 To 23
    		$S += $A[$i] * Cos(($B[$i] + ($C[$i] * $T)) * $fDegToRad)
    	Next
    	Return $S
    EndFunc   ;==>_periodic24
    
    
    ; -----Julian Date to TDT----------------------------------------------------------------
    ; Meeus Astronmical Algorithms Chapter 7
    Func _fromJDtoTDT($JD)
    	Local $A, $alpha
    	Local $Z = Int($JD + 0.5)
    	Local $F = ($JD + 0.5) - $Z
    	If $Z < 2299161 Then
    		$A = $Z
    	Else
    		$alpha = Int(($Z - 1867216.25) / 36524.25)
    		$A = $Z + 1 + $alpha - Int($alpha / 4)
    	EndIf
    	Local $B = $A + 1524
    	Local $C = Int(($B - 122.1) / 365.25)
    	Local $D = Int(365.25 * $C)
    	Local $E = Int(($B - $D) / 30.6001)
    	Local $DT = $B - $D - Int(30.6001 * $E) + $F ; Day of Month with decimals for time
    	Local $Mon = $E - ($E < 14 ? 1 : 13) ;         Month Number
    	Local $Yr = $C - ($Mon > 2 ? 4716 : 4715) ;    Year
    	Local $Day = Int($DT) ;                        Day of Month without decimals for time
    	Local $H = 24 * ($DT - $Day) ;                 Hours and fractional hours
    	Local $Hr = Int($H) ;                          Integer Hours
    	Local $M = 60 * ($H - $Hr) ;                   Minutes and fractional minutes
    	Local $Min = Int($M) ;                         Integer Minutes
    	Local $Sec = Int(60 * ($M - $Min)) ;           Integer Seconds (Milliseconds discarded)
    	Return StringFormat('%04d/%02d/%02d %02d:%02d:%02d', $Yr, $Mon, $Day, $Hr, $Min, $Sec)
    EndFunc   ;==>_fromJDtoTDT
    
    
    ; -----Correct TDT to UTC----------------------------------------------------------------
    ; TDT (Terrestial Dynamical Time) was used 1984-2000
    ; was replaced by TT (Terrestial Time) in 2001.
    Func _fromTDTtoUTC($TDT)
    	; from Meeus Astronmical Algroithms Chapter 10
    	; Correction lookup table has entry for every even year between TBLfirst and TBLlast
    	Local $TBLfirst = 1620, $TBLlast = 2018 ; Range of years in lookup table
    	Local $TBL[] = [ _ ; Corrections in Seconds
    			121, 112, 103, 95, 88, 82, 77, 72, 68, 63, 60, 56, 53, 51, 48, 46, 44, 42, 40, 38, _ ; 1620
    			35, 33, 31, 29, 26, 24, 22, 20, 18, 16, 14, 12, 11, 10, 9, 8, 7, 7, 7, 7, _ ; 1660
    			7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, _ ; 1700
    			11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, _ ; 1740
    			16, 16, 16, 16, 16, 16, 15, 15, 14, 13, _ ; 1780
    			13.1, 12.5, 12.2, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 11.9, 11.6, 11.0, 10.2, 9.2, 8.2, _ ; 1800
    			7.1, 6.2, 5.6, 5.4, 5.3, 5.4, 5.6, 5.9, 6.2, 6.5, 6.8, 7.1, 7.3, 7.5, 7.6, _ ; 1830
    			7.7, 7.3, 6.2, 5.2, 2.7, 1.4, -1.2, -2.8, -3.8, -4.8, -5.5, -5.3, -5.6, -5.7, -5.9, _ ; 1860
    			 - 6.0, -6.3, -6.5, -6.2, -4.7, -2.8, -0.1, 2.6, 5.3, 7.7, 10.4, 13.3, 16.0, 18.2, 20.2, _ ; 1890
    			21.1, 22.4, 23.5, 23.8, 24.3, 24.0, 23.9, 23.9, 23.7, 24.0, 24.3, 25.3, 26.2, 27.3, 28.2, _ ; 1920
    			29.1, 30.0, 30.7, 31.4, 32.2, 33.1, 34.0, 35.0, 36.5, 38.3, 40.2, 42.2, 44.5, 46.5, 48.5, _ ; 1950
    			50.5, 52.5, 53.8, 54.9, 55.8, 56.9, 58.3, 60.0, 61.6, 63.0, _  ; 1980
    			63.8, 64.3, 64.5, 64.8, 65.4, 66.0, 66.6, 67.2, 68.1, 69.2] ; 2000 - 2018 (2018 = prediction)
    	Local $deltaT = 0 ; deltaT = TDT - UTC (in Seconds)
    	Local $year = Number(StringLeft($TDT, 4))
    	Local $T = ($year - 2000) / 100 ; Centuries from the epoch 2000
    	If $year >= $TBLfirst And $year <= $TBLlast Then ; Find correction in table
    		If Mod($year, 2) Then ; Odd year - Interpolate
    			$deltaT = ($TBL[($year - $TBLfirst - 1) / 2] + $TBL[($year - $TBLfirst + 1) / 2]) / 2
    		Else ; Even year - direct table lookup
    			$deltaT = $TBL[($year - $TBLfirst) / 2]
    		EndIf
    	ElseIf $year < 948 Then
    		$deltaT = 2177 + 497 * $T + 44.1 * $T ^ 2
    	ElseIf $year >= 948 Then
    		$deltaT = 102 + 102 * $T + 25.3 * $T ^ 2
    		If $year >= 2000 And $year <= 2100 Then
    			$deltaT += 0.37 * ($year - 2100) ; Special correction to avoid discontinurity in 2000
    		EndIf
    	Else
    		Return SetError(1, 0, 0)
    	EndIf
    	Return _DateAdd('s', -Int($deltaT), $TDT)
    EndFunc   ;==>_fromTDTtoUTC
    Alles anzeigen

    Dateien

    _GetSeason.au3 3,21 kB – 304 Downloads _CalcSeason.au3 8,36 kB – 300 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™