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.
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.
Balkendiagramme | Charts | Google for Developers
hat aber nichts mit autoit zu tun, daten über datenbank und php füllen.
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).
ich auch nicht...
ich muss etwas ähnliches machen aber erst wenn meine Datenbank auch so läuft das es mit autoit funktioniert.
Deshalb habe ich mich auch noch nicht weiter damit beschäftigt aber es gibt zahlreiche Anleitungen im Internet.
und chatgpt würde mir dabei auch helfen^^.
edit:
Visualisierung: Anzeige | Charts | Google for Developers
wie rufst du die daten ab und möchtest du dann die daten im netz/Netzwerk ansehen oder nur lokal auf einem Rechner?du könntest wenn es nur lokal ist und du jede min die daten schon mit einem autoit Skript erhältst die Änderungen direkt im Dokument vornehmen und absichern.
Damit du die aufgerufene Seite im Browser nicht ständig selbst aktualisieren musst hier ein kleines Skript das die aufgerufene Seite im Browser jede min aktualisiert.
<!DOCTYPE html>
<html>
<head>
<title>Automatische Aktualisierung</title>
<script>
setTimeout(function(){
window.location.reload(1);
}, 60000); // 60000 Millisekunden = 1 Minute
</script>
</head>
<body>
<h1>Seite wird alle 1 Minute aktualisiert TEST</h1>
</body>
</html>
Alles anzeigen
als *htm absichern.
habe nun rumgetestet und es nicht auf anhieb hinbekommen das er den Chart aktuell hält.
habe nun mit einem anderen Skript versucht die Datei mit den JSON daten auszulesen und dann nur den Chart aktuell zu bekommen.
Also nur auf 1 Datei funktioniert bei mir zu mindestens nicht, also der googlechart.
Die udf für autoit wäre auch eine Möglichkeit wie water schon sagte.
Vielleicht funktioniert es aber auch mit einem localem Webserver, je nachdem wie kompliziert du es haben möchtest es geht immer komplizierter ^^.
Aber wenn´s dann läuft hat man was zu gucken :D^^.
oder einfach eine dicke PROGRESSBAR.
Anleitungen im Internet: mir fehlen die passenden Suchbegriffe
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/
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"
Ich meine mich zu erinnern, dass peethebee vor Urzeiten sowas realisiert hat. Kann mich im Moment nur nicht an den UDF Namen erinnern. Aber vielleicht erinnert sich jemand anders.
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"
Kannst Du bitte die komplette Fehlermeldung posten? Damit ich sehe, in welchem Beispielscript und auf welcher Zeile das Problem auftritt.
Ich habe den letzten Stand der UDF heruntergeladen, finde aber $xlEdgeLeft nirgends.
Von UEZ gibt es jede Menge Bildschirmschoner Code... die mit diversen Fortschrittsanzeigen arbeiten... diese könnte man ev. entsprechend "missbrauchen"
z.B. diesen _GDIPlus_StripProgressbar Example1.au3 oder den _GDIPlus_RingProgressbar
LG
Peter
Im engl. Forum sind die Übersichtsgrafiken nicht blockiert:
Peter
>"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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
#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".
"I:\BlpMenu\Entwicklung\_XLChart_Example_Thermometer Chart v3.0.au3"(955,43) : warning: $xlContinuous: possibly used before declaration.
Ah, das sind Beispiele vom Example Scripts thread. Diese Konstanten müssen noch im Skript definiert werden, da die ExcelChart UDF nur die von der UDF selbst verwendeten Konstanten definiert hat - das gäbe sonst eine ewig lange Liste. Die Konstanten findest Du hier.
Die Beispiele aus der ExcelChart UDF sollten aber Out-of-the-box funktionieren. Falls nein (die UDF ist ja schon etwas älter), einfach hier melden.
Als Start kannst du dies hier verwenden, um iCurrent darzustellen.
;coded by UEZ build 2023-20-11
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup()
Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
Global Const $iW = 600, $iH = 600, $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ Test"
Global Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi
AutoItSetOption("GUIOnEventMode", 1)
GDIPlus_Test()
AutoItSetOption("GUIOnEventMode", 0)
_GDIPlus_Shutdown()
Func GDIPlus_Test()
$bExit = False
$hGUI = GUICreate($sTitle, $iW, $iH) ;, 0, 0, $WS_POPUP)
GUISetState(@SW_SHOW, $hGUI)
;~ GUISetCursor(16, 1)
;create canvas elements
Local Const $hDC = _WinAPI_GetDC($hGUI)
Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
_GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
_GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _
$hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0808080), _
$hFormat_FPS = _GDIPlus_StringFormatCreate(), _
$hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _
$hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _
$tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16)
Local $fDiameter = 600
Local Const $hBitmap_Clock = GenerateGauge($fDiameter)
$iFPS = 0
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
AdlibRegister("CalcFPS", 1000)
Do
_GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter, $fDiameter)
_GDIPlus_GraphicsDrawStringEx($hCanvas, "FPS: " & $iShowFPS, $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) ;draw background message text
_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) ;blit drawn bitmap to GUI
$iFPS += 1
If $bExit Then ExitLoop
Until Not Sleep(30)
AdlibUnRegister("CalcFPS")
;release resources
_GDIPlus_FontDispose($hFont_FPS)
_GDIPlus_FontFamilyDispose($hFamily_FPS)
_GDIPlus_StringFormatDispose($hFormat_FPS)
_GDIPlus_BrushDispose($hBrush_Clr)
_GDIPlus_BrushDispose($hBrush_FPS)
_GDIPlus_GraphicsDispose($hCanvas)
_WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
_WinAPI_DeleteDC($hDC_backbuffer)
_WinAPI_DeleteObject($hHBitmap)
_WinAPI_ReleaseDC($hGUI, $hDC)
GUIDelete($hGUI)
EndFunc ;==>GDIPlus_Test
Func _Exit_About()
$bExit = True
EndFunc ;==>_Exit_About
Func CalcFPS() ;display FPS
$iShowFPS = $iFPS
$iFPS = 0
EndFunc ;==>CalcFPS
Func GenerateGauge($fDiameter)
Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter, $fDiameter), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _
$hEffect = _GDIPlus_EffectCreateBlur(10.5, 0), $fBorderSize = $fDiameter * 0.03333
Local $hPen = _GDIPlus_PenCreate(0), $hMatrix, $hBrush = _GDIPlus_LineBrushCreate($fDiameter / 2, 0, $fDiameter / 2, $fDiameter, 0xF0F0F0F0, 0xF0303030, 3)
_GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
_GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4)
_GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF)
_GDIPlus_PenSetColor($hPen, 0xA0000000)
_GDIPlus_PenSetWidth($hPen, $fBorderSize)
Local Const $fSize = $fDiameter * 0.95 - $fBorderSize / 2, $fRadius = $fDiameter / 2
_GDIPlus_LineBrushSetGammaCorrection($hBrush)
_GDIPlus_GraphicsFillEllipse($hGfx, $fDiameter - $fDiameter * 0.94, $fDiameter - $fDiameter * 0.94, $fDiameter * 0.92, $fDiameter * 0.92, $hBrush)
_GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize + $fDiameter * 0.005, $fBorderSize + $fDiameter * 0.01, $fSize, $fSize, $hPen)
_GDIPlus_BitmapApplyEffect($hBitmap, $hEffect)
_GDIPlus_PenSetColor($hPen, 0xF0000000)
_GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hPen)
_GDIPlus_GraphicsTranslateTransform($hGfx, $fDiameter / 2, $fDiameter / 2)
_GDIPlus_GraphicsRotateTransform($hGfx, -126)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fDiameter / 2, -$fDiameter / 2)
Local $iWidth1 = $fDiameter * 0.0125, $iHeight1 = $fDiameter / 15, $iWidth12 = $iWidth1 / 2, $fPosY = $fDiameter * 0.083333, _
$iWidth2 = $fDiameter * 0.013333, $iHeight2 = $fDiameter * 0.0416667, $iWidth22 = $iWidth2 / 2
_GDIPlus_BrushDispose($hBrush)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
For $i = 0 to 40
_GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
_GDIPlus_GraphicsRotateTransform($hGfx, 6)
_GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
Switch Mod($i, 4)
Case 0
_GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth12, $fPosY, $iWidth1, $iHeight1, $hBrush)
Case Else
;~ _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth22, $fPosY, $iWidth2, $iHeight2, $hBrush)
EndSwitch
Next
_GDIPlus_GraphicsResetTransform($hGfx)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
$hBrush = _GDIPlus_LineBrushCreate(0, 0, $fSize, $fSize, 0x8000FF00, 0xC8FF0000, 3)
$hMatrix = _GDIPlus_MatrixCreate()
_GDIPlus_MatrixRotate($hMatrix, -5)
_GDIPlus_LineBrushSetTransform($hBrush, $hMatrix)
$hPen = _GDIPlus_PenCreate2($hBrush, $fDiameter * 0.03)
_GDIPlus_GraphicsDrawArc($hGfx, $fBorderSize + $fDiameter * 0.03333, $fBorderSize + $fDiameter * 0.03333, $fSize * 0.93, $fSize * 0.93, -211.5, 243.5, $hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PenDispose($hPen)
$hBrush = _GDIPlus_BrushCreateSolid(0x80000000)
$hPen = _GDIPlus_PenCreate(0x40000000, 2)
_GDIPlus_GraphicsFillEllipse($hGfx, $fDiameter / 2 - $iWidth2, $fDiameter / 2 - $iWidth2, $iWidth2 * 2, $iWidth2 * 2, $hBrush)
_GDIPlus_GraphicsDrawEllipse($hGfx, $fDiameter / 2 - $iWidth2, $fDiameter / 2 - $iWidth2, $iWidth2 * 2, $iWidth2 * 2, $hPen)
_GDIPlus_MatrixDispose($hMatrix)
_GDIPlus_EffectDispose($hEffect)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGfx)
Return $hBitmap
EndFunc
Alles anzeigen
Dies ist nur das Hintergrundbild, d.h. du müsstest noch einen drehenden Zeiger entsprechend dem $iCurrent Wert implementieren.