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. HansJ54

Beiträge von HansJ54

  • Komplette GUI als "Button"

    • HansJ54
    • 7. Februar 2024 um 19:20

    Noch eine Bitte: wie erzeuge ich den JSON-String am geschicktesten? Aktuell setze ich ihn einfach als Textstring mit den Namen und Werten zusammen, aber da bietet AutoIt doch sicher eine bessere Lösung. Ich habe mich schon mit der JSON.au3 beschäftigt, aber finde nichts Passendes. Mir schwebt eine Idee vor von einem Array, in dem die Namen der Variablen als Index und zugeordnet die jeweiligen Werte stehen.

    Ist kein wichtiges Problem, dient auch nur meiner "Weiterbildung" 8)

  • Komplette GUI als "Button"

    • HansJ54
    • 6. Februar 2024 um 16:56

    Danke an Solve-Smart, funktioniert einwandfrei.

    Und Kanashius bietet die Rettung, da sich ein kleines für mich unlösbares Problem ergeben hat: Screenshots funktionieren anscheinend nicht, wenn der Sperrbildschirm aktiv ist. Habe mich jetzt 2 Nächte lang gewundert, dass, wie ich nachher feststellte, immer der gleiche Screenshot hochgeladen wurde. Ich vermute, dass ein Screenshot im Sperrbildschirm grundsätzlich nicht möglich ist!?
    Also werde ich das umstellen auf Hochladen der Daten - ist nur wieder Neuland für mich.
    Nicht wundern, über die fehlenden neuen Screenshots bei Nacht (sind ja eigentlich nicht so interessant außer Spannung und Hz), die Screenshots funktionieren natürlich auch tagsüber nur, wenn das Script auf dem offenen Bildschirm läuft.

    Und der Link im Footer ist defekt: Meine Website: Kanashius Website (einige meiner Programme sind auch hier zu finden)

  • Komplette GUI als "Button"

    • HansJ54
    • 5. Februar 2024 um 20:42

    Kurz mein Ziel (und ich versuche immer gleichzeitig beim Programmieren zu lernen):
    Ich habe an unser Balkonkraftwerk eine Shelly PM Mini angeschlossen und frage die Werte getaktet ab (vermeide damit die Deye-Cloud). Habe dafür eine GUI programmiert, die auf unserem Server läuft. Um von zuhause reinschauen zu können ohne Verbindung zum Server lade ich jede Minute einen Screenshot auf eine Webseite hoch. Aus optischen Gründen gefallen mir dabei die 4 Buttons unten rechts nicht. Könnte sie vor dem Screenshot kurz ausschalten, aber auch so wäre die Optik besser ohne. Daher die Idee, sie auszublenden und auf Mausklick irgendwo auf der GUI einblenden. Ist nicht "lebensnotwendig", aber nice to know wie das geht.

    Erste Änderung: vor dem Screenshot Buttons ausblenden und nachher zurück (Schnuffel Nr. 2):

    Das mit dem Label drüberlegen klappt noch nicht, suche das Problem.

  • Komplette GUI als "Button"

    • HansJ54
    • 3. Februar 2024 um 21:17

    Ich hoffe ich kann meine Idee verständlich beschreiben:

    Ich möchte ein Fenster mit Daten ohne Buttons anzeigen und wenn man irgendwo ins Fenster klickt, sollen die Buttons erscheinen - also vorher versteckt. Und auf Klick auf einen Button sollen diese wieder ausgeblendet werden. Geht das?

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 23:47
    AutoIt
    #include <JSON.au3>
    #include <date.au3>
    
    Global $iId, $iVoltage, $iCurrent, $iaPower, $iFreq, $iTotal, $iMinute0, $iMinute1, $iMinute2, $iMinute_ts, $sDate, $sTime
    
    $sUrl = "http://192.168.200.131/rpc/PM1.GetStatus?id=0"
    
    ;Shelly abfragen
    $sJSON = BinaryToString(InetRead($sUrl))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sJSON = ' & $sJSON & @CRLF) 
    
    ;JSON in die Werte von Shelly zerlegen
    Zerlegen($sJSON)
    
    ;Shelly Daten anzeigen
    ShellyShowData()
    
    Func Zerlegen($sSource)
        ; JSON-String in verschachteltes AutoIt-Objekt parsen
        Local $Obj = Json_Decode($sSource)
        ; die einzelnen, benötigten Werte auslesen
        $iId         = Json_Get($Obj, '["id"]')
        $iVoltage     = Json_Get($Obj, '["voltage"]')
        $iCurrent     = Json_Get($Obj, '["current"]')
        $iaPower      = Json_Get($Obj, '["apower"]')
        $iFreq        = Json_Get($Obj, '["freq"]')
        $iTotal       = Json_Get($Obj, '["aenergy.total"]')
        $iMinute0     = Json_Get($Obj, '["aenergy.by_minute"][0]')
        $iMinute1     = Json_Get($Obj, '["aenergy.by_minute"][1]')
        $iMinute2     = Json_Get($Obj, '["aenergy.by_minute"][2]')
        $iMinute_ts = Json_Get($Obj, '["aenergy.minute_ts"]')
        $sDate      = UnixToDate($iMinute_ts)
        $sTime      = UnixToTime($iMinute_ts)
        ; noch mal ausgeben:
        json_dump($sJSON) ;(nur Info)
    EndFunc
    
    Func ShellyShowData()
        $sErgebnis = "$iId"  & @TAB & @TAB & "= " & @TAB & $iId & @CRLF & _
                     "$iVoltage"     & @TAB & "= " & @TAB & $iVoltage & @CRLF & _
                     "$iCurrent"     & @TAB & "= " & @TAB & $iCurrent & @CRLF & _
                     "$iaPower "     & @TAB & "= " & @TAB & $iaPower  & @CRLF & _
                     "$iFreq      "    & @TAB & "= " & @TAB & $iFreq    & @CRLF & _
                     "$iTotal     "    & @TAB & "= " & @TAB & $iTotal   & @CRLF & _
                     "$iMinute0"     & @TAB & "= " & @TAB & $iMinute0 & @CRLF & _
                     "$iMinute1"     & @TAB & "= " & @TAB & $iMinute1 & @CRLF & _
                     "$iMinute2"     & @TAB & "= " & @TAB & $iMinute2 & @CRLF & _
                     "$iMinute_ts"     & @TAB & "= " & @TAB & $iMinute_ts & @CRLF & _
                     "$sDate      "    & @TAB & "= " & @TAB & $sDate      & @CRLF & _
                     "$sTime      "    & @TAB & "= " & @TAB & $sTime      & @CRLF & _
                     @CRLF & "$sJSON:" & @CRLF & $sJSON   & @CRLF
        MsgBox(0, @ScriptName & " (Ergebnis)", $sErgebnis)
    EndFunc
    
    Func UnixDate($sUnixDate)
        Return _DateTimeFormat( _DateAdd( 's', $iMinute_ts, "1970/01/01 01:00:00"),0)
    EndFunc
    
    Func UnixToDate($sUnixDate)
        Return StringLeft(_DateTimeFormat( _DateAdd( 's', $iMinute_ts, "1970/01/01 01:00:00"),0), 10)
    EndFunc
    
    Func UnixToTime($sUnixDate)
        Return StringRight(_DateTimeFormat( _DateAdd( 's', $iMinute_ts, "1970/01/01 01:00:00"),0), 8)
    EndFunc
    Alles anzeigen

    Mein bisheriger Ansatz: die Abfrage alle n Minuten und in eine csv speichern, die ich anschließend nach Monaten oder so auswerte. Zusätzlich noch eine ständig aktualisierte Anzeige von "current".

    pasted-from-clipboard.png

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 23:42

    >"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3" /UserParams

    +>19:27:37 Starting AutoIt3Wrapper (19.1127.1402.0} from:SciTE.exe (4.2.0.0) Keyboard:00000407 OS:WIN_10/ CPU:X64 OS:X64 Environment(Language:0407) CodePage:0 utf8.auto.check:4

    +> SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE UserDir => C:\Users\lenzen\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper SCITE_USERHOME => C:\Users\lenzen\AppData\Local\AutoIt v3\SciTE

    >Running AU3Check (3.3.16.1) from:C:\Program Files (x86)\AutoIt3 input:I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3

    "I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3"(954,144) : warning: $xlEdgeLeft: possibly used before declaration.

    With $oExcel.Activesheet.Range($oExcel.Cells($sRangeOrRowStart, $iColStart), $oExcel.Cells($iRowEnd, $iColEnd)).Borders($xlEdgeLeft)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    "I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3"(955,43) : warning: $xlContinuous: possibly used before declaration.

    .LineStyle = $xlContinuous

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    "I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3"(956,43) : warning: $xlAutomatic: possibly used before declaration.

    .ColorIndex = $xlAutomatic

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 19:28
    Zitat von water

    So was? https://www.autoitscript.com/forum/topic/173924-chart_udf/

    Falls Du Excel zur Verfügung hast: https://www.autoitscript.com/forum/files/file/443-excelchart/

    Sehr gut die UDF von Kanashius. Muss zwar noch ein wenig angepasst werden da das Datum bei meinen Tests nicht unter den Balken steht, aber guter Ansatz.
    Bei den Excel-Charts bekomme ich im Moment bei jedem Beispiel eine Fehlermeldung, dass irgendwelche Variablen nicht deklariert sind. "warning: $xlEdgeLeft: possibly used before declaration"

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 17:49

    Anleitungen im Internet: mir fehlen die passenden Suchbegriffe

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 17:42

    Würde mich ja fast jetzt dazu bringen, das über den Weg direkt zu programmieren. Ich frage über die Url einer ShellyMini die Leistung meines Balkonkraftwerks ab. Eine nette Anzeige wäre die Anzeige der aktuellen Leistung in einem "Tacho". Habe nur leider keine Ahnung von der Programmierung in HTML oder Javascript.
    Idee wäre jede Minute einmal die Url http://192.168.200.131/rpc/PM1.GetStatus?id=0 aufzurufen, aus dem Ergebnis {"id":0, "voltage":232.4, "current":0.000, "apower":0.0 ,"freq":50.2,"aenergy":{"total":651.396,"by_minute":[0.000,0.000,0.000],"minute_ts":1700239163}} den Wert von current zu nehmen und in den Tacho von Google zu packen.

    Die statistische Auswertung der Daten wäre dann wieder Aufgabe von einen AutoIt Script (das habe ich fertig).

  • Balkengrafik

    • HansJ54
    • 17. November 2023 um 16:29

    Gesucht und mal wieder nichts gefunden:

    gibt es Funktionen oder fertige Scripte zur Anzeige von Balkengrafiken ohne in Excel zu wechseln? Ich möchte eine csv-Datei auswerten mit Balken oder Kurven.

  • Prüfen ob eine Variable ein Text oder eine Bool'sche Variable ist

    • HansJ54
    • 26. September 2023 um 19:35

    Perfekt, danke. Ich hatte etwas in der Art wie StringIsBool() oder ähnlich gesucht ...

  • Prüfen ob eine Variable ein Text oder eine Bool'sche Variable ist

    • HansJ54
    • 26. September 2023 um 19:07

    Vermutlich bin ich nur blind, aber wie kann ich überprüfen ob eine Variable einen Text oder einen Bool'schen Wert enthält?

    $Val = False

    $Val = "False"

    Wie kann ich das testen? Wenn ich den Wert über MsgBox() ausgebe, kommt in beiden Fällen False.

  • _Singleton funktioniert manchmal nicht

    • HansJ54
    • 26. September 2023 um 17:45

    Oscar : danke, Programm umgestellt. Muss mir das in nächster Zeit einfach anschauen, da, wie gesagt, nicht bewusst reproduzierbar.

    Deswegen auch meine Idee, irgendwo nachzuschauen, was die beiden laufenden Instanzen (wenn es mal wieder so ist) bei sOccurrenceName hinterlegt haben. Aber vermutlich wird das nach vorne schieben ja schon helfen.

  • _Singleton funktioniert manchmal nicht

    • HansJ54
    • 26. September 2023 um 16:28
    Zitat von Oscar

    Was steht in dieser UDF?

    Wird dort bereits irgendein Code ausgeführt?

    Der würde den _Singleton-Befehl nämlich verzögern.

    Ich habe den Post zur besseren Verständlichkeit stark verkürzt. Tatsächlich gibt es noch mehrere inkludierte UDFs neben den blp_ToolsAllg.au3. Und das sind insgesamt noch mal ca. 4.000 Zeilen. Es werden Variablen deklariert, aber nichts sonst ausgeführt. Würde aufgrund der Größenordnung nichts bringen, alles zu posten. Die Anleitung zu _Singleton ist relativ einfach, in der Hilfe sehe ich nichts was ich nicht gemacht hätte.
    Kann ich den _Singleton eigentlich ganz an den Anfang setzen vor den #Includes? Ein Timing-Problem war ja auch mein erster Gedanke (versehentlich 2x schnell mit der Maus geklickt), speziell da das Problem so extrem selten auftritt und nicht bewusst reproduzierbar ist.

  • _Singleton funktioniert manchmal nicht

    • HansJ54
    • 26. September 2023 um 09:52
    C
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=Weltkugel.ico
    #AutoIt3Wrapper_Outfile_x64=I:\BlpMenu\BlpMenu.exe
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Res_Fileversion=8.14.0.753
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
    #AutoIt3Wrapper_Res_ProductName=BlpMenu
    #AutoIt3Wrapper_Res_ProductVersion=1.0.0
    #AutoIt3Wrapper_Res_CompanyName=BLP
    #AutoIt3Wrapper_Res_LegalCopyright=BLP
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #pragma compile(Icon, I:\BlpMenu\Entwicklung\weltkugel.ico)
    
    #Region header files
    #include "blp_ToolsAllg.au3"
    #include <WinAPI.au3>
    #include <Misc.au3>
    #include <MsgBoxConstants.au3>
    #EndRegion header files
    
    Global $sProgName = "BlpMenu"
    
    ; Test ob das Programm bereits gestartet ist
    If _Singleton("BlpMenuCheck", 1) = 0 Then
        MsgBox($MB_SYSTEMMODAL, "Warnung", "Eine Instanz des Programmes " & $sProgName & " wird bereits ausgeführt!")
        Exit
    EndIf
    
    ; und jetzt noch ca. 5.000 Zeilen Code
    Alles anzeigen

    Allerdings glaube ich nicht, dass man mit dem Codestück herausfinden kann, wo AutoIt sich den Wert "BlpMenuCheck" merkt um ein evt. Timing-Problem aufzuspüren :?:

  • _Singleton funktioniert manchmal nicht

    • HansJ54
    • 25. September 2023 um 21:14

    Seit einigen Jahren nutze ich _Singleton um Mehrfachstarts meiner Programme zu verhindern. Funktioniert grundsätzlich. Allerdings ganz selten (und wirklich sehr selten) startet das Programm doch ein zweites Mal. Eine Idee: zu schnell hintereinander geklickt, so dass sOccurrenceName noch nicht hinterlegt ist ...

    Hat jemand eine Idee, wie die Funktion feststellt, dass sOccurrenceName schon existiert? Ich hätte das irgendwo bei den Tasks vermutet, finde aber im Taskmanager nichts. Aber irgendwo muss sOccurrenceName doch abgelegt sein? Vielleicht kann man damit den Fehler tracen?

    Danke für Eure Hilfe!

  • Run("C:\Windows\System32\quser.exe"...) und ShellExecute(...) funktionieren nicht

    • HansJ54
    • 1. Mai 2023 um 18:53
    Zitat von Musashi

    Also bei läuft es :

    Beispiel :

    Hast Du, wie Velted vermutet, auf einem anderen Rechner getestet ?

    Gleicher Rechner, wieder mit F5 aus dem SciTE gestartet! Dein Script funktioniert einwandfrei im Gegensatz zu meinem Test eben (Screenshots waren ja dabei). Habe die beiden Zeilen noch mal vor Deinem Script eingefügt und jetzt kommt auch dabei richtig 0 bei System32 und 1 bei SysNative. Keine Idee wieso.


    Funktioniert, auf jeden Fall vielen Dank für Eure Hilfe!

  • Run("C:\Windows\System32\quser.exe"...) und ShellExecute(...) funktionieren nicht

    • HansJ54
    • 1. Mai 2023 um 18:38
    Zitat von Velted

    Keine Ahnung! Bist Du immer noch am selben Rechner mit demselben Softwarestand?

    Ja, WIN10 64Bit

  • Run("C:\Windows\System32\quser.exe"...) und ShellExecute(...) funktionieren nicht

    • HansJ54
    • 1. Mai 2023 um 16:58

    Danke, war mir nicht bekannt! Ich habe nach "SysNative" gegoogelt: demnach hast Du Recht.

    Aber bei den MsgBoxen kommt etwas anderes raus - wo ist mein Fehler?

    pasted-from-clipboard.png

  • Run("C:\Windows\System32\quser.exe"...) und ShellExecute(...) funktionieren nicht

    • HansJ54
    • 1. Mai 2023 um 15:03

    Ich versuche abzufragen, welche(r) User auf einem anderen Client (hier z.B. BLP5-WX) angemeldet ist. Im cmd-Fenster funktioniert das problemlos:

    In meinem Script bekomme ich sowohl bei Run() wie auch ShellExecute() eine Fehlermeldung, dass die Datei nicht gefunden werden konnte:

    AutoIt
    #include <AutoItConstants.au3>
    
    Example("C:\Windows\System32\quser.exe /server:blp5-wx")
    Example("C:\Windows\System32\quser.exe")
    Example("C:\Windows\System32\cmd.exe")
    
    Func Example($sCommand)
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sCommand = ' & $sCommand & @CRLF)
    
        Local $iPID = Run($sCommand, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD )
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iPID = ' & $iPID & ' >Error code: ' & @error & @CRLF)
        ProcessWaitClose($iPID)
    
        Local $iPID = ShellExecute($sCommand, "", "", "", @SW_HIDE)
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iPID = ' & $iPID & ' >Error code: ' & @error & @CRLF)
        ProcessWaitClose($iPID)
    
    EndFunc   ;==>Example
    Alles anzeigen

    Testweise habe ich es mit "C:\Windows\System32\cmd.exe" versucht, das funktioniert. Wo könnte das Problem bei der quser.exe liegen?

    Nachtrag: ich habe die quser.exe in c:\temp kopiert, da funktioniert es. Kann man von AutoIt nicht auf System32 zugreifen?

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™