3 verschiedene Farben auf bestimmten Koordinaten erkennen und Meldung ausgeben

  • Hallo hier mal mein Script

    Spoiler anzeigen

    Beschreibung vom Script:

    Das Script scannt einen bestimmten Bereich auf dem Monitor. Dieser Bereich zeigt ein webbasiertes Servermonitoring.

    Im Normalfall ist dort die Farbe grün = OK

    Wenn es auf orange oder rot wechselt, soll dieses Script hier später einen aktustischen Alarm auslösen (aktuell nur ein Konsolenausgabe)

    Aktuell habe ich ein System mal vom Netz genommen, d.h. an der zu suchenden Stelle ist jetzt die Farbe rot. Es wird mir aber in der Console nur Kein Treffer bei OK und Kein Treffer bei orangener Alarm ausgegeben. Es müsste doch aber auch Roter Alarm ausgegeben werden. Alle 3 Farben wurden mit einer Farbpipette ausgelesen.

    Es ist das erste mal, das ich mit sowas rumspiele, es fehlt also der Erfahrungswert. BTW. Kann mir vielleicht noch jemand helfen, wie ich später statt der Consolenausgabe eine MP3 Sounddatei abspiele.

    Vielen Dank

  • Code
    If $aCoord = PixelSearch(-2833, 835, -2771, 872, 0x53A000)

    Das kannst Du so nicht schreiben. Pixelsearch gibt einen 2D Array zurück, wenn was gefunden wurde. Du vergleichst den Rückgabewert dann aber mit einem leeren Array.
    Lt. Hilfedatei wird @error = 1 gesetzt, wenn die Farbe nicht gefunden wurde. Daher:

    Code
        ; Wenn in den unten stehenden Koordinaten die Farbe rot (0xA00000) zu finden ist, ist Warnstufe 2 angesagt
        $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xA00000)
        If Not @error Then
            ConsoleWrite("Roter Alarm" & @CRLF)
        Else
            ConsoleWrite("Kein Treffer bei rotem Alarm" & @CRLF)
        EndIf

    BTW: Ein Tool zum Servermonitoring sollte eine Schnittstelle für Alarmierungen bereits mit anbieten. Wäre sicher der verlässlichere Weg!

  • BTW: Ein Tool zum Servermonitoring sollte eine Schnittstelle für Alarmierungen bereits mit anbieten. Wäre sicher der verlässlichere Weg!

    "Sollte" ist das Stichwort...

    Ich arbeite täglich mit webbasiertem Monitoring für Produktionsmaschinen/Mitarbeiterarbeitsplätzen. Da gibt es NICHTS, was nicht explizit seitens Softwarehersteller vorgesehen ist, alternativ "nachgepflegt/programmiert" worden ist. Manche Dinge sind nicht einmal vorgesehen, da seitens Programmierer dieser Fall/Fälle infolge mangelnder Fachkenntnis (die sind schliesslich Programmierer und keine Anwender! ) nie den Weg in die Software gefunden haben noch finden werden.

    Zitat von Wikipedia

    AutoIt ist eine Software zum Ausführen von Skripten, mit denen hauptsächlich Abläufe unter Microsoft Windows automatisiert werden können,

    ...genau DAFÜR ist es da! Um nicht vorhandene Funktionen/Abläufe "nachzubilden", die es sonst nicht gegeben hätte!

  • Sorry, ich träume halt immer noch von warmen Eislutschern :)

  • water: Danke jetzt geht es wunderbar. Jetzt muss ich nur noch den MP3 Teil "erfinden" und einbauen. Falls Ihr zufällig hier im Forum einen Thread kennt, der auch schon mit MP3 Ausgabe in autoit gespielt hat, wäre ich für eine Link sehr dankbar.

  • Danke für die Rückmeldung. Ich habe jetzt den integrierten genommen. Bei mir ist es egal ob MP3 oder WAV. Sind nur 2 unterschiedliche Dateien. Läuft soweit schon, jetzt noch Feinheiten. Trotzdem vielen Dank an alle. Werden den Thread als gelöst markieren.

  • Guten Morgen, jetzt muss ich den Thread doch nochmals öffnen

    Code

    Ich habe das Problem, das meine Funktion _OKpressed() (Zeile 67) erst aufgerufen werden soll, nachdem die GUI gebaut wird. Jedoch ist es aktuell so, das beim Starten des Scriptes dieses gleich nonstop durch die Funktion _OKpressed() läuft.

    Vermutlich hat es was damit zu tun, dass $sButton zu diesem Zeitpunkt noch nicht existiert. Wie kann ich dass dann umgehen?

  • Ich vermute mal GUIGetMsg liefert 0 weil kein Event anliegt, da neue Variablen undefiniert sind stimmen sie mit 0 überein (es sei dem man erzwingt einen anderen Vergleich).

    Du solltest generell nicht die GUIs dynamisch erzeugen, da kann sehr viel schiefgehen. Erzeuge sie vorher und zeige/verstecke sie mit GUISetState wann immer du sie brauchst.

    Bevor du sie anzeigst kannst du die Daten auf der GUI setzen damit diese bereits mit den gewünschten Daten auftaucht.

    Dann hast du auch nicht das Problem des Null-Events.

    Oder du bastelst einen schlampigen Workaround und setzt $sButton (s ist übrigens der total falsche Präfix dafür, da dies eine Id bzw. ein Handle bzw. ein Button ist) = 1.

  • Hallo alpines, vielen Dank für die Info. Für den schnellen Test mache ich jetzt mal den "schlampigen Workaround", werde das aber dann zeitnah umbauen.

    Ich habe noch 2 weitere Fragen.

    1.) Ich prüfe ja mit $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xXXXXXX) auf die Existenz eines Farbcodes 0xXXXXXX (wobei hier 0xXXXXXX als Variable für meine anderen Farben zu sehen ist). Im konkreten Fall prüfe ich auf die Farben grün, orange und rot. Wie muss ich denn eine 4. Prüfung schreiben, die mir z.B. eine MsgBox hochpoppt, wenn an diesen Koordinaten eine andere Farbe als diese 3 zu sehen ist. Ich will damit sicherstellen, das ich mein Monitorfenster wieder nach vorne hole, falls ich es mal temporär mit einem anderen Fenster überdeckt habe.

    2.) Ich habe ursprünglich mal den Wert 0xFAA731 eingegeben. Jetzt bin ich in einer anderen Lokation, wo der LCD Monitor hier den Wert 0xFAA732 erkennt. Kann man das irgendwie einstellen, das ein paar Farbnuancen noch oben und unten als Toleranz gewertet werden?

  • Ich habe ursprünglich mal den Wert 0xFAA731 eingegeben. Jetzt bin ich in einer anderen Lokation, wo der LCD Monitor hier den Wert 0xFAA732 erkennt. Kann man das irgendwie einstellen, das ein paar Farbnuancen noch oben und unten als Toleranz gewertet werden?

    Schau dir mal den Parameter der PixelSearch-Funktion an der nach "color" kommt.

    Ich prüfe ja mit $aCoord = PixelSearch(-2833, 835, -2771, 872, 0xXXXXXX) auf die Existenz eines Farbcodes 0xXXXXXX (wobei hier 0xXXXXXX als Variable für meine anderen Farben zu sehen ist). Im konkreten Fall prüfe ich auf die Farben grün, orange und rot. Wie muss ich denn eine 4. Prüfung schreiben, die mir z.B. eine MsgBox hochpoppt, wenn an diesen Koordinaten eine andere Farbe als diese 3 zu sehen ist. Ich will damit sicherstellen, das ich mein Monitorfenster wieder nach vorne hole, falls ich es mal temporär mit einem anderen Fenster überdeckt habe.

    Schlagen die PixelSearches, für die Farben die dort sein sollten, alle fehl, dann hast du doch eine andere Farbe dort. Das kriegst du mittels einer If-Abfrage hin.

  • Den Toleranzpart habe ich mal eingebaut. Der scheint auch zu funktionieren. Den Teil mit den "anderen" Farben muss ich noch machen. Aktuell habe ich das Problem, das sich meine GUI in Zeile 157 nicht aktualisiert. Zeile 158 protokolliert eine "0". Das versteht ich jetzt nicht ganz.

    Code

    Ich dachte mit GUISetState(@SW_SHOW, $hGUI) erzeugt man einen Refresh der GUI?

    Vermutlich ist es das gleiche, wie ich hier schon mal hatte. Die GUI soll aber halt dann aktualisiert werden, wenn ich einen orangenen oder roten Alarm habe. Das muss doch irgendwie möglich sein.

    Einmal editiert, zuletzt von Code4Fun (29. April 2019 um 13:52) aus folgendem Grund: alten Thread herausgesucht und verlinkt

  • Ich dachte mit GUISetState(@SW_SHOW, $hGUI) erzeugt man einen Refresh der GUI?

    Was ist denn ein "Refresh" von einer GUI?

    GUISetState setzt nur den State einer GUI, diese kann unter anderem Versteckt, Angezeigt und Gesperrt sein.

    Mit GUICtrlSetData kannst du neue Werte der Controls auf der GUI setzen welche dann direkt übernommen werden.

  • Habe mein Problem gefunden. Musste die Zeile auf If $iAlarmCounter <> 2 Then ändern, dann läuft das auch rein, wenn $iAlarmCounter = 1 ist. Frage ich eigentlich den @error falsch ab? Der GUISetState geht jetzt, aber bei der Zeile ConsoleWrite("Rückgabe von @error nachdem GUI aktualisiert wurde: " & @error & @CRLF & @CRLF) bekomme ich immer noch eine 0 als Ergebnis. Laut Hilfe ist aber 0 = Fehler.

  • Eine Sache ist mir noch nicht ganz klar. Du schreibst von einem webbasiertem Monitoring-System. Wenn es nicht gerade eine uralte Flash- oder Java-Webanwendung ist, wäre es doch deutlich eleganter, den Status über die IE.au3 oder noch besser per TCP/HTTP abzufragen. Mit Pixel-Farben zu hantieren ist immer irgendwie Mist und neigt zur Fehleranfälligkeit und Unzuverlässigkeit. Hast du das schon versucht?