philco
Goto Top

Bildschirmbereich überwachen - E-Mail

Hallo,

kennt jemand ein Programm mit dem ich einen gewissen Bildschirmbereich, oder Bildschirmpixel auf Änderungen überwachen kann?

An einer unserer Maschinen ist am Bildschirm eine Statusanzeige die Grün ist wenn die Maschine läuft, und der
Bereich wird rot, wenn ein Fehler oder ähnliches aufgetreten ist. Gibt es eine Möglichkeit zu checken ob der Bereich oder Pixel
Grün ist, und wenn nicht, eine E-Mail zu schicken?

Verwendetes Betriebssystem ist Windows.

LG Philipp

Content-Key: 238319

Url: https://administrator.de/contentid/238319

Printed on: April 19, 2024 at 19:04 o'clock

Member: SlainteMhath
SlainteMhath May 16, 2014 at 11:40:45 (UTC)
Goto Top
Moin,

Tools wie AutoIT und AutoHotKey sollten sowas können.

lg,
Slainte
Member: Lochkartenstanzer
Lochkartenstanzer May 16, 2014 at 11:57:58 (UTC)
Goto Top
Alternative:

Überwachungkamera drauf richten und die Überwachunssoftware eine Mail schicken lassen, wenn sich das Bild ändert. face-smile

lks
Member: colinardo
Solution colinardo May 16, 2014, updated at May 19, 2014 at 14:26:26 (UTC)
Goto Top
Hallo Philipp,
das wäre eigentlich die letzte Art wie ich so was überprüfen würde. Ich würde auf jeden Fall nochmal checken, ob sich der Status nicht doch über eine andere Art und Weise abfragen lässt. Wenn es wirklich keine andere Möglichkeit geben sollte, was ich fast nicht glauben kann, kannst du es mit folgendem AutoIT-Script verwirklichen, du müsst dann aber sicherstellen können das kein anderes Fenster den Status überdeckt:

Im Script sind die x und y Koordinaten an dem die Farbe auf dem Bildschirm abgefragt werden soll, anzugeben (Zeile 5 und 6). Dann sind noch die Daten für den Mailversand anzupassen (ab Zeile 9) . Jetzt musst du noch in Zeile 37 die entsprechende Farbe in ARGB-HEX-Notation angeben bei der an der Maschine alles im "grünen Bereich" liegt. Für deine Hilfe welche Farbe sich an der entsprechenden Positon befindet lasse ich diese bei einem Durchlauf des Scriptes in die Zwischenablage kopieren, damit du sie danach in Zeile 37 eintragen kannst.
Da Script ist jetzt vorerst mal ohne Dauerschleife konstruiert und für die Verwendung im Taskplaner konzipiert, das ließe sich aber einfach umstellen.
#NoTrayIcon
#include <ScreenCapture.au3>
#include <File.au3>
; x- und y-Position definieren an der die Farbe aufgenommen werden soll
$posX = 0
$posY = 0
;-------------------
; --- Mail Einstellungen ----- 
$MAILFROM = "absender@email.de"  
$MAILTO = "empfänger@email.de"  
$MAILFROMNAME = "Absendername"  
$MAILBODY = "Der Body der Nachricht"  
$MAILSUBJECT = "Der Betreff der Nachricht"  
$MAILATTACHMENT = ""  
$MAILSERVER = "SMTP.SERVER.DE"  
$SMTPUSER = "SMTPUSERNAME"  
$SMTPPASS = "SMTPPASSWORD"  
$SMTPPORT = "25"  
$SMTPUSESSL = 1
; ------------------------------

_GDIPlus_Startup() ;initialize GDI+
;screen capture an definierter Position
Local $hHBmp = _ScreenCapture_Capture("", $posX, $posY, 1, 1)  
;konvertiere GDI to GDI+ bitmap
Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBmp)
;release resources
_WinAPI_DeleteObject($hHBmp)
;hole pixel farbe im ARGB Format
$iColor = _GDIPlus_BitmapGetPixel($hBitmap, 0, 0)
_GDIPlus_Shutdown() ; Shutdown GDI
;konvertiere ARGB to HEX
$iColorHex = Hex($iColor,8)
; Zur Hilfe wird die Farbe an der angegebenen Position in die Zwischenablage kopiert damit sie unten in der IF-Abfrage hinterlegt werden kann
ClipPut($iColorHex)

if $iColorHex = "FF2C5E99" then  
	msgbox(64,"","Maschine ist OK",1)  
	exit 0
Else
	msgbox(48,"","Maschine ist nicht OK",1)  
	; --- Send Mail
	_INetSmtpMailCom($MAILSERVER,$MAILFROMNAME,$MAILFROM,$MAILTO,$MAILSUBJECT,$MAILBODY,$MAILATTACHMENT,"","","High",$SMTPUSER,$SMTPPASS,$SMTPPORT,$SMTPUSESSL)  
	exit 1
endif


; SENDMAIL Function to send Mail using CDO -----------------------------------------

; Variables for Function _INetSmtpMailCom
;=========================================
;~ $SmtpServer = ""                 ; address for the smtp-server to use - REQUIRED  
;~ $FromName = "User"               ; name from who the email was sent  
;~ $FromAddress = ""                ; address from where the mail should come  
;~ $ToAddress = ""                  ; destination address of the email - REQUIRED  
;~ $Subject = "testsubject"         ; subject from the email - can be anything you want it to be  
;~ $Body = "This Is The Body"       ; the messagebody from the mail - can be left blank but then you get a blank mail  
;~ $AttachFiles = ""                ; the file you want to attach- leave blank if not needed  
;~ $CcAddress = ""                  ; address for cc - leave blank if not needed  
;~ $BccAddress = ""                 ; address for bcc - leave blank if not needed  
;~ $Importance = "Normal"           ; Send message priority: "High", "Normal", "Low"  
;~ $Username = ""                   ; username for the account used from where the mail gets sent - REQUIRED  
;~ $Password = ""                   ; password for the account used from where the mail gets sent - REQUIRED  
;~ $IPPort = 25                     ; port used for sending the mail
;~ $ssl=0                           ; put to 1 if using httpS
;=========================================

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)  
    Local $objEmail = ObjCreate("CDO.Message")  
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'  
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""  
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress  
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress  
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then  
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then  
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")  
        For $x = 1 To $S_Files2Attach
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
            ConsoleWrite('@@ Debug(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console  
            If FileExists($S_Files2Attach[$x]) Then
                $objEmail.AddAttachment ($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)  
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2  
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer  
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort  
    ;Authenticated SMTP
    If $s_Username <> "" Then  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password  
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True  
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"  
        Case "Normal"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"  
        Case "Low"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"  
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
    EndIf
    $objEmail=""  
EndFunc   ;==>_INetSmtpMailCom
Viel Erfolg

Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Member: philco
philco May 19, 2014 at 14:27:15 (UTC)
Goto Top
Danke, mit dem kann ich was anfangen face-smile
Member: thebigeasy99
thebigeasy99 Apr 25, 2015 at 12:54:10 (UTC)
Goto Top
Hallo Uwe,

ich würde dein Script gerne als Maschinenüberwachung für die Meldung des Maschinenstops einsetzen.
Bisher konnte ich die Maschine über 30 m mit dem Gehör abfragen, aber jetzt hab ich die Fräse in einem separaten Raum
praktisch Schall geschützt in Betrieb.

Kannst du mir, den schon selbst in Aussicht gestellten Loop, einbauen. Abfrage alle 30 Sekunden

ich selbst schaffe es gerade den Script zu starten. Ich hab die Anpassung bezüglich der Koordinaten hinbekommen.
so das die Farbveränderung auch die gewünschten Reaktion auslöst.

Schön wäre wenn das Script über einen Button gestartet werden kann oder noch besser mit dem Klick auf den eigentlich Start-Button im Steuerungsprogramm der Maschine, das Script mitgestartet wird. Bei der farblichen Veränderung der Endposition der Frässpindel wird dann die E-Mail versendet und am Laptop einen definierbarer Ton ausgegeben. Gleichzeitig stoppt der Loop.

Gruß

Lutz
Member: colinardo
colinardo Apr 25, 2015 updated at 13:55:04 (UTC)
Goto Top
Hallo Lutz,
hier das angepasste Script das so lange in einer Schleife läuft bis sich die Farbe ändert, dann schickt es die Mail und das Script beendet sich. Die Zeit zwischen den Überprüfungen kannst du in Zeile 45 festlegen (im Moment 5 Sekunden). Zusätzlich kannst du in Zeile 38 den Pfad zu einer Sounddatei angeben welche abgespielt werden soll.

oder noch besser mit dem Klick auf den eigentlich Start-Button im Steuerungsprogramm der Maschine, das Script mitgestartet wird
Den Start des Scripts an deiner Maschine kann ich hier ja nicht programmieren die kenne ich ja nicht face-wink
Da das Script aber sowieso zu einer EXE kompiliert wird lässt sich das sicher einfach bewerkstelligen, frage einfach den Verantwortlichen der Maschine, der weiß sicherlich wie er das machen muss.

Viel Spaß
Grüße Uwe
p.s. und Danke für deine Spende face-smile

#NoTrayIcon
#include <ScreenCapture.au3>
#include <File.au3>
; x- und y-Position definieren an der die Farbe aufgenommen werden soll
$posX = 0
$posY = 0
; --- Mail Einstellungen -----
$MAILFROM = "absender@email.de"  
$MAILTO = "empfänger@email.de"  
$MAILFROMNAME = "Absendername"  
$MAILBODY = "Der Body der Nachricht"  
$MAILSUBJECT = "Der Betreff der Nachricht"  
$MAILATTACHMENT = ""  
$MAILSERVER = "SMTP.SERVER.DE"  
$SMTPUSER = "SMTPUSERNAME"  
$SMTPPASS = "SMTPPASSWORD"  
$SMTPPORT = "25"  
$SMTPUSESSL = 1
; ------------------------------

_GDIPlus_Startup() ;initialize GDI+

While 1
	;screen capture an definierter Position
	Local $hHBmp = _ScreenCapture_Capture("", $posX, $posY, 1, 1)  
	;konvertiere GDI to GDI+ bitmap
	Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBmp)
	;release resources
	_WinAPI_DeleteObject($hHBmp)
	;hole pixel farbe im ARGB Format
	$iColor = _GDIPlus_BitmapGetPixel($hBitmap, 0, 0)

	;konvertiere ARGB to HEX
	$iColorHex = Hex($iColor,8)

	if $iColorHex <> "FF2D6099" then  
		; Ton abspielen
		SoundPlay("C:\Windows\Media\tada.wav")  
		; --- Send Mail
		_INetSmtpMailCom($MAILSERVER,$MAILFROMNAME,$MAILFROM,$MAILTO,$MAILSUBJECT,$MAILBODY,$MAILATTACHMENT,"","","High",$SMTPUSER,$SMTPPASS,$SMTPPORT,$SMTPUSESSL)  
		; Beende den Loop und damit das Programm
		ExitLoop
	endif
	 ; Zeit zwischen den Überprüfungen (ms)
	Sleep(5000)
wend

_GDIPlus_Shutdown() ; Shutdown GDI
exit 0
; ENDE

; SENDMAIL Function to send Mail using CDO -----------------------------------------

; Variables for Function _INetSmtpMailCom
;=========================================
;~ $SmtpServer = ""                 ; address for the smtp-server to use - REQUIRED  
;~ $FromName = "User"               ; name from who the email was sent  
;~ $FromAddress = ""                ; address from where the mail should come  
;~ $ToAddress = ""                  ; destination address of the email - REQUIRED  
;~ $Subject = "testsubject"         ; subject from the email - can be anything you want it to be  
;~ $Body = "This Is The Body"       ; the messagebody from the mail - can be left blank but then you get a blank mail  
;~ $AttachFiles = ""                ; the file you want to attach- leave blank if not needed  
;~ $CcAddress = ""                  ; address for cc - leave blank if not needed  
;~ $BccAddress = ""                 ; address for bcc - leave blank if not needed  
;~ $Importance = "Normal"           ; Send message priority: "High", "Normal", "Low"  
;~ $Username = ""                   ; username for the account used from where the mail gets sent - REQUIRED  
;~ $Password = ""                   ; password for the account used from where the mail gets sent - REQUIRED  
;~ $IPPort = 25                     ; port used for sending the mail
;~ $ssl=0                           ; put to 1 if using httpS
;=========================================

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)  
    Local $objEmail = ObjCreate("CDO.Message")  
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'  
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""  
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress  
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress  
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then  
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then  
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")  
        For $x = 1 To $S_Files2Attach
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
            ConsoleWrite('@@ Debug(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console  
            If FileExists($S_Files2Attach[$x]) Then
                $objEmail.AddAttachment ($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)  
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2  
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer  
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort  
    ;Authenticated SMTP
    If $s_Username <> "" Then  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username  
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password  
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True  
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"  
        Case "Normal"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"  
        Case "Low"  
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"  
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
    EndIf
    $objEmail=""  
EndFunc   ;==>_INetSmtpMailCom
Member: thebigeasy99
thebigeasy99 Apr 25, 2015 at 14:08:26 (UTC)
Goto Top
Hallo Uwe,

ich muß schon sagen das ging ja rasend schnell.

Vielen Dank.

Bei dem Start des Scripts habe ich mir gedacht, das vielleicht der Klick auf einen bestimmten Bereich des Bildschirmes das Script starten würde.
Wenn man den Bereich genau so definieren könnte wie den Bereich für die Abfrage der Pixelfarbe dann könnte man diesen spezifischen Bereich auf den Startbutton des Steuerungsprogrammes legen. Das Steuerungsprogramm würde mit diesem Klick gestartet und der Script durch das Klicken in den definierten Bereich ebenfalls.
Im Vorfeld ist das Script schon aktiviert. Praktisch in Bereitschaft.

Ist diese Idee umsetzbar?

Gruß

Lutz
Member: colinardo
colinardo Apr 25, 2015 updated at 14:59:23 (UTC)
Goto Top
Ist diese Idee umsetzbar?
Meiner Meinung nach sehr unzuverlässig und von hier aus nicht möglich, ohne das Programm detaillierter zu kennen. Anderst herum ginge das eher (Script betätigt Start-Button der Maschine), aber um das zu realisieren müsste ich vor deinem Rechner sitzen.

Schau noch mal genau in die Doku des Steuerprogramms, da lassen sich sicherlich Batches oder ähnlich hinterlegen die vor einem Start ausgeführt werden können.

Ansonsten die Exe einfach auf den Desktop legen und nach dem Maschinenstart aufrufen ,feddich.

Das Script selber mit einem Button zu versehen ginge aber problemlos. Selbst Traysymbole mit Kontextmenü sind realisierbar.

Eine andere Methode wäre natürlich auch das das Script auf bestimmte Änderungen im Steuerungsprogramm reagiert, z.B. ein Button ändert seinen Text, in einer Textbox steht ein anderer Text etc. pp. Dafür aber, wie gesagt muss ich mit Tools vor dem Rechner sitzen, damit man das Script richtig schreiben kann.

Bei Interesse einfach via PM melden dann könnte ich dir das gegen eine entsprechende Aufwandsentschädigung umsetzen oder erst mal anschauen.
Member: thebigeasy99
thebigeasy99 Apr 27, 2015 at 13:27:28 (UTC)
Goto Top
Hallo Uwe,

danke für dein Statement.

Ich bring dein Script erstmal an den Start.
Auf dein Angebot komme ich dann ggfs. zurück.
Vielen DAnk für deine Unterstützung.

Gruß

Lutz