Workaround für "Vantage Pro2 nicht gefunden"

Fragen, Anregungen zur PC-Wetterstations-Software

Moderatoren: Werner, Tex, weneu

rf-leo
Beiträge: 104
Registriert: 06 Dez 2006 15:31
Wohnort: Leopoldshöhe
Hat sich bedankt: 1 mal
Kontaktdaten:

Workaround für "Vantage Pro2 nicht gefunden"

Beitrag von rf-leo »

Ein Hallo in die Community,

in Anbetracht der Tatsache, dass immer wieder Betreiber von Wswin in Verbindung mit einer Vantage Pro2 auf Schnittstellenfehler laufen und Wswin dann hängen bleibt, veröffentliche ich hier mal meinen kleinen Workaround.
In unregelmäßigen Abständen bin ich auch davon betroffen, bei mir ist es aber in Verbindung mit der 04:00 Uhr-Geschichte.

Als erstes müsst ihr in Wswin unter
Datei - Optionen - das Kästchen "Fehler (Kommunikation, Fehlerkorrektur) protokollieren <b>anhaken</b>
Im Anschluss sollte dann im Wswin-Verzeichnis, im Fehlerfall, die Datei 'WSWINERR.TXT' auflaufen.
Bei einem Schnittstellenfehler, mit anschließenden hängenbleiben, sieht der Eintrag wie folgt dann aus: "..... Vantage Pro2 nicht gefunden 10".

Und eben diesen Eintrag werte ich mit einem Powershell-Script unter Windows 10 dann aus.

Script-Name: 'kill-wswin.ps1'

Code: Alles auswählen

# setzen der Variablen
$ProgName = "Wswin32"
$ProgNameStart = "C&#58;\&#91;Pfad zu Ordner&#93;\Wswin32.exe"
$LogPath = "C&#58;\&#91;Pfad zu Ordner&#93;\"

$LogWswin = "WSWINERR.TXT"
$SearchString = "Vantage Pro2 nicht gefunden 10"

$LogRest = "restart.log"
$RestText = "Restart von WsWin nach vorherigen Fehler"
$LineNumber = 0
$RealRest = 0


# durchsuchen des Log-Files nach dem Suchstring
If &#40;Test-Path &#40;$LogPath + $LogWswin&#41;&#41;&#123;
    $StreamReader = New-Object System.IO.StreamReader&#40;&#40;$LogPath + $LogWswin&#41;&#41;
    While &#40;$StreamReader.Endofstream -eq $False&#41;&#123;
        $Line=$StreamReader.ReadLine&#40;&#41;
        If&#40;$Line -match $SearchString&#41;&#123;
            $Line | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
            $RealRest +=1
        &#125;
    &#125;
    $StreamReader.Close&#40;&#41;
&#125;

# Aktion nach gefundenen Suchstring
If&#40;$RealRest -gt 0&#41;&#123;
    Stop-Process -Name $ProgName -Force
    Start-Sleep -s 15
    $DateTime = Get-Date -UFormat "%d.%m.%Y %H&#58;%M&#58;%S"
    "&#123;0&#125; &#123;1&#125;" -f $DateTime, $RestText + "`r`n" | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
    Start-Process -FilePath $ProgNameStart
	Copy-Item -Path &#40;$LogPath + $LogWswin&#41; -Destination &#40;$LogPath + $LogWswin + ".bak"&#41; -Force
    Remove-Item &#40;$LogPath + $LogWswin&#41; -Force
&#125;
<b>[Pfad zu Ordner]</b> muß natürlich von euch noch entsprechend eurer Verzeichnis-Struktur angepasst werden!

Ablauf des Scriptes:
Das Logfile wird nach dem 'SearchString' durchsucht. Beim Auftreten eines entsprechenden Eintrags wird die betreffende Zeile in die 'restart.log' übernommen und der Restart-Zähler 'RealRest' auf einen Wert größer Null gesetzt.
Im Zweiten Teil dann, wenn der Restart-Zähler eben größer Null ist, wird der Prozess von Wswin gekillt. Dieser Zeitpunkt wird in die 'restart.log' übernommen und Wswin wird neu gestartet.
Zu guter Letzt wird die 'WSWINERR.TXT' in ''WSWINERR.TXT.bak' kopiert und die eigentliche 'WSWINERR.TXT' gelöscht.

Damit nun das Ganze auch automatisch und alleine funktioniert, lasse ich über die Aufgabenplanung in regelmäßigen Abständen das beschriebene Script laufen.
Das Script kann dabei mit den Rechten des angemeldeten Users betrieben werden. Wichtig bei der Aufgabendefinition sind lediglich im Registerreiter Aktion die folgenden Einträge.
Bei 'Programm/Script' lautet der Eintrag: '%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe'.
Bei 'Argumente hinzufügen (optional): '-noninteractive -command "C:\[Pfad zu Ordner]\kill-wswin.ps1'.
Bei Starten in (optional): 'C:\[Pfad zu Ordner]\Wswin'.

Seit dem ich diesen kleinen Woraround betreibe, habe ich keine Schwierigkeiten mehr und meine Wetterseite ist immer aktuell!

Auf einen durchlaufenden Betrieb .....


Gruß
Rainer
http://www.krentruperhagen.de, im schönen Lipperland!
Marc S
Beiträge: 178
Registriert: 14 Mär 2006 20:46
Wohnort: Linnich
Kontaktdaten:

Beitrag von Marc S »

Hi Rainer

Schöne Sache und prima Arbeit !! Hab es gerade mal getestet und es funktioniert bestens. Einen kleinen Fehler ist in der Beschreibung.
Bei 'Argumente hinzufügen (optional): '-noninteractive -command "C:\[Pfad zu Ordner]\kill-wswin.ps1'.
hier fehlt am Ende "C:\[Pfad zu Ordner]\kill-wswin.ps1"

Für alle die noch mit WIN 7 unterwegs sein sollten, da wir das Script nicht direkt funktionieren, da die Sicherheitseinstellungen es nicht zu lassen. Wie ihr es dann doch zum laufen bringt könnt ihr hier nachlesen. [/b]

https://www.borncity.com/.../2010/02/2 ... -ausfhren/
mfg
Marc
rf-leo
Beiträge: 104
Registriert: 06 Dez 2006 15:31
Wohnort: Leopoldshöhe
Hat sich bedankt: 1 mal
Kontaktdaten:

Beitrag von rf-leo »

Hallo Marc,

danke für den Hinweis mit den Gänsefüßchen, hast recht.

Und, an die Sicherheitseinstellungen habe ich auch nicht mehr gedacht.
Dieses gilt übrigens auch für die späteren Windows-Versionen.

Da der Link von Marc bei mir ins Leere läuft hier noch ein weiterer:
http://www.searchdatacenter.de/tipp/Tip ... richtlinie

Wer noch mehr zu der Powershell-Kommando-Zeile wissen möchte:
https://docs.microsoft.com/de-de/powers ... rshell-5.1

Gruß
Rainer
http://www.krentruperhagen.de, im schönen Lipperland!
Benutzeravatar
ManfredK
Beiträge: 490
Registriert: 16 Mai 2009 07:54
Wohnort: Ruppersthal in Niederösterreich
Hat sich bedankt: 9 mal
Kontaktdaten:

Beitrag von ManfredK »

Hallo Rainer,

Tolle Sache. Läuft perfekt!
Zuletzt geändert von ManfredK am 20 Sep 2017 12:04, insgesamt 1-mal geändert.
Marc S
Beiträge: 178
Registriert: 14 Mär 2006 20:46
Wohnort: Linnich
Kontaktdaten:

Beitrag von Marc S »

Hi Manfred

Danke,aber das Lob gehört dem Rainer. :D
mfg
Marc
Benutzeravatar
ManfredK
Beiträge: 490
Registriert: 16 Mai 2009 07:54
Wohnort: Ruppersthal in Niederösterreich
Hat sich bedankt: 9 mal
Kontaktdaten:

Beitrag von ManfredK »

Marc S hat geschrieben:Hi Manfred

Danke,aber das Lob gehört dem Rainer. :D
Ups!!! Mein Fehler!

Vielen Dank Rainer!
Läuft auch mit mehreren Instanzen von WsWin.
Marc S
Beiträge: 178
Registriert: 14 Mär 2006 20:46
Wohnort: Linnich
Kontaktdaten:

Beitrag von Marc S »

Marc S hat geschrieben:Läuft auch mit mehreren Instanzen von WsWin.
Ja richtig. Auch mit anderen Fehlern wie z.B. Html/WAP-Error Rewrite.
mfg
Marc
rf-leo
Beiträge: 104
Registriert: 06 Dez 2006 15:31
Wohnort: Leopoldshöhe
Hat sich bedankt: 1 mal
Kontaktdaten:

Beitrag von rf-leo »

Hallo Zusammen,

im Laufe der Zeit hatte ich noch ein paar weitere "Fehler", die ein Aufhängen von WsWin zur Folge hatten.
Diese neuen Meldungen habe ich der folgenden Version des Scriptes nun eingebracht ...

Seit dem Einsatz des Scriptes gab es bei mir keine Situation mehr, in der ich händisch das System neu starten musste, für mich somit ein Erfolg. :D

Code: Alles auswählen

# setzen der Variablen
$ProgName = "Wswin32"
$ProgNameStart = "C&#58;\&#91;Pfad zu Ordner&#93;\Wswin32.exe"
$LogPath = "C&#58;\&#91;Pfad zu Ordner&#93;\"

$LogWswin = "WSWINERR.TXT"
$SearchStrings = @&#40;"Vantage Pro2 nicht gefunden 10", "Com/USB-Error ... Restart", "Problem closing ComPort", "WsWin-Application-Error_1000"&#41;

$LogRest = "restart.log"
$RestText = "Restart von WsWin nach vorherigen Fehler"
$LineNumber = 0
$RealRest = 0


# durchsuchen des Log-Files nach den Suchstrings
If &#40;Test-Path &#40;$LogPath + $LogWswin&#41;&#41;&#123;
	Foreach&#40;$SearchString in $SearchStrings&#41;&#123;
		$StreamReader = New-Object System.IO.StreamReader&#40;&#40;$LogPath + $LogWswin&#41;&#41;
		While &#40;$StreamReader.Endofstream -eq $False&#41;&#123;
			$Line=$StreamReader.ReadLine&#40;&#41;
			If&#40;$Line -match $SearchString&#41;&#123;
				$Line | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
				$RealRest +=1
			&#125;
		&#125;
		$StreamReader.Close&#40;&#41;
	&#125;
&#125;

# Aktion nach gefundenen Suchstring
If&#40;$RealRest -gt 0&#41;&#123;
    Stop-Process -Name $ProgName -Force
    Start-Sleep -s 15
    $DateTime = Get-Date -UFormat "%d.%m.%Y %H&#58;%M&#58;%S"
    "&#123;0&#125; &#123;1&#125;" -f $DateTime, $RestText + "`r`n" | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
    Start-Process -FilePath $ProgNameStart
	Copy-Item -Path &#40;$LogPath + $LogWswin&#41; -Destination &#40;$LogPath + $LogWswin + ".bak"&#41; -Force
    Remove-Item &#40;$LogPath + $LogWswin&#41; -Force
&#125;

Gruß
Rainer
http://www.krentruperhagen.de, im schönen Lipperland!
exxes
Beiträge: 55
Registriert: 11 Nov 2010 22:05
Wohnort: Kreuzau Kreis Düren
Kontaktdaten:

Beitrag von exxes »

Hallo Rainer,

ich habe mich mal an Dein Workaround gemacht, da ich auch das Phänomen habe das entweder um 3.58 Uhr oder 15.38 Uhr die Vantage nicht mehr erreichbar ist. Ich erhalte dann einen Schnittstellenfehler.
Leider bekomme ich Dein Script nicht zum laufen.

Ich betreibe WsWin unter Windows10 mit 3 Instanzen. 2 davon hängen sich in unregelmäßigen Abständen auf. Aber immer zur selben Uhrzeit.

Ich habe das Script aus Deinem letzten Beitrag genommen und die in die Aufgabenplanung übernommen. Als erstes bekam ich nach dem Start des Scripts den blauen Bildschirm angezeigt indem später kurz eine rote Schrift zu erkennen war. Nach kurzer Recherche war klar es handelt sich um einen Policy Fehler. Die Einstellung wurde von mir geändert. " Set-ExecutionPolicy bypass -force" Dies sollte testweise alle Scripts zulassen.

Nun kann ich das Script starten, jedoch passiert nichts weiter. Es kommt kurz das blaue Bild und verschwindet dann wieder nach den eingestellten 15 Sek. Pause. Es wird aber weder WSWIn beendet und neu gestartet, noch die WSWINERR.TXT umbenannt in WSWINERR.TXT.bak

Ja in der WSWINERR.txt ist der Fehler der Instanz sichtbar. ..... Vantage Pro2 nicht gefunden 10".

Hat vielleicht von Euch noch jemand eine Idee woran es liegen könnte ?
Pfade in der Aufgabenplanung sowie in der kill-wswin.ps1 wurden mehrfach kontrolliert.

Hier mal meine kill-wswin.ps1

:roll

Code: Alles auswählen

# setzen der Variablen
$ProgName = "Wswin32"
$ProgNameStart = "C&#58;\wetter\wswin\Wswin32.exe"
$LogPath = "C&#58;\wetter\wswin"

$LogWswin = "WSWINERR.TXT"
$SearchStrings = @&#40;"Vantage Pro2 nicht gefunden 10", "Com/USB-Error ... Restart", "Problem closing ComPort", "WsWin-Application-Error_1000"&#41;

$LogRest = "restart.log"
$RestText = "Restart von WsWin nach vorherigen Fehler"
$LineNumber = 0
$RealRest = 0


# durchsuchen des Log-Files nach den Suchstrings
If &#40;Test-Path &#40;$LogPath + $LogWswin&#41;&#41;&#123;
   Foreach&#40;$SearchString in $SearchStrings&#41;&#123;
      $StreamReader = New-Object System.IO.StreamReader&#40;&#40;$LogPath + $LogWswin&#41;&#41;
      While &#40;$StreamReader.Endofstream -eq $False&#41;&#123;
         $Line=$StreamReader.ReadLine&#40;&#41;
         If&#40;$Line -match $SearchString&#41;&#123;
            $Line | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
            $RealRest +=1
         &#125;
      &#125;
      $StreamReader.Close&#40;&#41;
   &#125;
&#125;

# Aktion nach gefundenen Suchstring
If&#40;$RealRest -gt 0&#41;&#123;
    Stop-Process -Name $ProgName -Force
    Start-Sleep -s 15
    $DateTime = Get-Date -UFormat "%d.%m.%Y %H&#58;%M&#58;%S"
    "&#123;0&#125; &#123;1&#125;" -f $DateTime, $RestText + "`r`n" | Out-File -FilePath &#40;$LogPath + $LogRest&#41; -encoding Default -Append
	    Start-Process -FilePath $ProgNameStart
   Copy-Item -Path &#40;$LogPath + $LogWswin&#41; -Destination &#40;$LogPath + $LogWswin + ".bak"&#41; -Force
    Remove-Item &#40;$LogPath + $LogWswin&#41; -Force
&#125;	
In der Aufgabenplanung habe ich folgendes Eingetragen
Programm / Script
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe

Argumente hinzufügen "-noninteractive -command "c:\wetter\wswin\kill-wswin.ps1"

Starten in (optional) C:\wetter\wswin


Laut Aufgebanplanung wird der Vorgang erfolgreich beendet. Leider hängt die WSWin Instanz danach unverändert und wurde nicht neu gestartet.


Hat da von Euch jemand ne Idee ? :roll:
Mit schönen Grüßen aus der Voreifel

Thomas
rf-leo
Beiträge: 104
Registriert: 06 Dez 2006 15:31
Wohnort: Leopoldshöhe
Hat sich bedankt: 1 mal
Kontaktdaten:

Beitrag von rf-leo »

Hallo Thomas,

wir versuchen es mal ...
exxes hat geschrieben:Ich erhalte dann einen Schnittstellenfehler.
Laufen alle 3 WsWin-Instanzen über eine Schnittstelle??? - Ehrlich gesagt, ich verstehe deinen Aufbau noch nicht ganz! Was für eine Wetterstation betreibst du denn?
exxes hat geschrieben:Ich betreibe WsWin unter Windows10 mit 3 Instanzen.
Ich vermute mal, dass in diesem Fall die Variable '$ProgName = "Wswin32"' bei dir nicht passt.
Schau mal im Task-Manager unter Details nach, wie die einzelnen Instanzen bei dir genannt werden bzw. vom System differenziert werden und pass es entsprechend an.
exxes hat geschrieben:Argumente hinzufügen "-noninteractive -command "c:\wetter\wswin\kill-wswin.ps1"
Vor -noninteractive sind die Anführungszeichen zuviel, oder insgesamt hinten einmal zu wenig.

Du kannst das Script durchaus auch mal in der 'Powershell' ausführen. Darin sind dann evtl. Fehlermeldungen auch zu lesen, die ansonsten mit der Beendigung verschwinden.


Gruß
Rainer
http://www.krentruperhagen.de, im schönen Lipperland!
exxes
Beiträge: 55
Registriert: 11 Nov 2010 22:05
Wohnort: Kreuzau Kreis Düren
Kontaktdaten:

Beitrag von exxes »

Hallo Rainer,

wir versuchen es mal ...
Laufen alle 3 WsWin-Instanzen über eine Schnittstelle??? - Ehrlich gesagt, ich verstehe deinen Aufbau noch nicht ganz! Was für eine Wetterstation betreibst du denn?
Ich betreibe eine Vantage Pro2 Plus aktiv. Die 3 WSWIN Instanzen bekommen über Virtual VP eigene Com Ports zugeteilt. Die Konsole hängt per USB an meinem Wetterserver.
Ich vermute mal, dass in diesem Fall die Variable '$ProgName = "Wswin32"' bei dir nicht passt.
Schau mal im Task-Manager unter Details nach, wie die einzelnen Instanzen bei dir genannt werden bzw. vom System differenziert werden und pass es entsprechend an.
Den Vergleich habe ich bereits durchgeführt und teilweise angepasst. Der Text im SearchString passte nicht.
Vor -noninteractive sind die Anführungszeichen zuviel, oder insgesamt hinten einmal zu wenig.
Sorry hatte diese Zeilen markieren wollen. Im Aufgabenplaner sind die Satzzeichen nicht enthalten.
Du kannst das Script durchaus auch mal in der 'Powershell' ausführen. Darin sind dann evtl. Fehlermeldungen auch zu lesen, die ansonsten mit der Beendigung verschwinden.
Ich bin Heute schon ein Stück weiter gekommen. Das Script kann ich per Aufgabenplanung laufen lassen. Es kommt nach ca. 20 Sek. kurz eine Fehlermeldung. Ich konnte davon aber einen Screenshot machen.

Bild

Jetzt gibt es zwei Szenarien die sich sporadisch abwechseln.
Szenario 1:

Die Aufgabenplanung startet. Powershell öffnet ein blaues Fenster. Es kommt zur obigen Fehlermeldung.
Das Fenster wird irgendwann geschlossen und WSWin wird beendet. Die WINERR.TXT.bak wird geschrieben und WSWIn neu gestartet. Jetzt aber mit einem CRC Fehler. Das Auslesen der Daten startet nicht.


Szenario 2

Aufgabenplanung startet ebenfalls und öffnet ein blaues Fenster. Es kommt zur obigen Fehlermeldung.
WSWIN wird nicht beendet und es wird eine weitere Instanz geöffnet.
Natürlich hier mit einem Schnittstellenfehler da die andere Instanz nicht beendet werden konnte. Auch hier wird die WSWINERR.TXT.bak geschrieben.

Leider helfen mir beide Szenarien so nicht weiter. Ich habe auch schon geschaut ob es einen weiteren Befehl gibt um den Prozess "WSWIN32" zu killen (Programm zu schließen )
Mit schönen Grüßen aus der Voreifel

Thomas
Benutzeravatar
Werner
Site Admin
Beiträge: 5681
Registriert: 04 Dez 2001 01:00
Wohnort: Lackenhäuser
Danksagung erhalten: 59 mal
Kontaktdaten:

Beitrag von Werner »

@Thomas,

Lösungsansatz:
Du solltest Wswin umbenennen z.B. zu Wswin32_1.exe (usw.).

Der Taskmanager unterscheidet die gestarteten Instanzen über die Prozess-Id - das Script unterscheidet das aber nicht.

Werner
exxes
Beiträge: 55
Registriert: 11 Nov 2010 22:05
Wohnort: Kreuzau Kreis Düren
Kontaktdaten:

Beitrag von exxes »

Guten Morgen Werner,

Das hört sich gut an. Werde ich mal testen. Geb dann später Bescheid.
Mit schönen Grüßen aus der Voreifel

Thomas
exxes
Beiträge: 55
Registriert: 11 Nov 2010 22:05
Wohnort: Kreuzau Kreis Düren
Kontaktdaten:

Beitrag von exxes »

@Werner

So, habe die Instanzen mal umbenannt wie von dir beschrieben. Leider ändert sich nichts. Die Instanz wird nicht beendet über das Script. Stattdessen wird eine neue Instanz geöffnet die mit Schnittstellenfehler startet. Der Com Port ist ja durch die nicht beendete Instanz belegt.

Wenn ich direkt über den Taskmanager gehe und dort schließe geht es sofort.
Kann man nicht mit dem Knüppel rangehen ? Ich meine einen anderen Befehl in dem Powershell Script nutzen ? Kenne mich nicht so gut aus mit der Programmierung von ps. Dort steht aber "Stop-Process"
kann man dies nicht ändern in "kill-Process" ???

Habe das hier gefunden, weis aber nicht wie ich es im Script einsetzen sollte.

Code: Alles auswählen

 # PowerShell Kill Process
Clear-Host
$process = Get-Process example
$process.Kill&#40;&#41;
Wenn ich die Instanz normal beende, über Datei / Programm beenden, schließt sich diese auch nicht. Ich kann nur über den Taskmanager gehen und dort den Task beenden.

:roll:

Nicht die feinste Art aber nur so geht es.
Mit schönen Grüßen aus der Voreifel

Thomas
rf-leo
Beiträge: 104
Registriert: 06 Dez 2006 15:31
Wohnort: Leopoldshöhe
Hat sich bedankt: 1 mal
Kontaktdaten:

Beitrag von rf-leo »

Hallo Thomas,
exxes hat geschrieben:Das Script kann ich per Aufgabenplanung laufen lassen. Es kommt nach ca. 20 Sek. kurz eine Fehlermeldung. Ich konnte davon aber einen Screenshot machen. ...
Mich wundert daran, dass der Zugriff verweigert wird.
Startest du WsWin mit administrativen Rechten und lässt das Script mit geringeren Rechten ausführen?
Was passiert, wenn du das Script einfach mal mit administrativen Rechte ausführst?

Ein Auszug aus der Microsoft-Doku:
'Access is denied' - '... show the effect of using Force to stop a process that is not owned by the user.'
Quelle: https://docs.microsoft.com/en-us/powers ... wershell-6

Für den vorgeschlagenen Weg von dir mit 'process.Kill()' versuch es mal wie folgt:
Ersetze die Zeile

Code: Alles auswählen

Stop-Process -Name $ProgName -Force
mit den zwei Zeilen

Code: Alles auswählen

$process = Get-Process $ProgName
$process.Kill&#40;&#41;
... kann aber keine Garantie geben, weil selber nicht getestet.


Gruß
Rainer
http://www.krentruperhagen.de, im schönen Lipperland!
Antworten