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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 238319
Url: https://administrator.de/contentid/238319
Ausgedruckt am: 24.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
Alternative:
Überwachungkamera drauf richten und die Überwachunssoftware eine Mail schicken lassen, wenn sich das Bild ändert.
lks
Überwachungkamera drauf richten und die Überwachunssoftware eine Mail schicken lassen, wenn sich das Bild ändert.
lks
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.
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
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
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
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
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
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.
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
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 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
#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
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
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
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.