![]() |
Thingspeak - Datenabruf
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo in die Runde, ich versuche mit
Delphi-Quellcode:
(hier im Forum gefunden) die Daten eines Channels abzurufen.
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, IdHTTP; procedure Main; var http : TIdHTTP; resultStr: string; begin http := TIdHTTP.Create( nil ); try resultStr := http.Get( 'https://api.thingspeak.com/channels/9/fields/1.json?results=10' ); finally http.Free; end; Writeln( resultStr ); end; begin try Main; except on E: Exception do Writeln( E.ClassName, ': ', E.Message ); end; ReadLn; end. siehe: ![]() aber leider erscheint nur eine Fehlermeldung: siehe Anhang. Wie ist das Problem zu lösen? Danke Stefan |
AW: Thingspeak - Datenabruf
Zitat:
![]() Bis bald... Thomas |
AW: Thingspeak - Datenabruf
danke, dann habe ich mich falsch ausgedrückt. Ziel ist es die abgerufenen Werte in eine SQlite-Datenbank einzutragen.
Derzeit dokumentiere ich es in Excel mittels VBA. Die URL lautet: 'https://api.thingspeak.com/channels/1671193/feeds.csv' & Appendix wobei Appendix = 'start=Datum des letzten Eintrages' ist. Die URL sollte gleichfalls so aufgebaut sein. Ich versuchte ![]() Stefan |
AW: Thingspeak - Datenabruf
Welche Delphi Version?
|
AW: Thingspeak - Datenabruf
Hallo, Delphi 10.4 Version 27.0.40680.4203
Stefan |
AW: Thingspeak - Datenabruf
Mit
![]()
Delphi-Quellcode:
Bis bald...
uses
mormot.core.base, mormot.core.search, mormot.net.client; type TCsvItem = packed record created_at: TDateTime; entry_id: Integer; field1: Double; field2: Double; field3: Double; field4: String; end; TCsvItems = array of TCsvItem; var url: RawUtf8; content: RawByteString; csvItems: TCsvItems; begin url := 'https://api.thingspeak.com/channels/1671193/feeds.csv?start="2023-05-02T19:20"'; content := HttpGet(url); if (content <> '') and DynArrayLoadCsv(csvItems, content, TypeInfo(TCsvItems)) then begin var count: Integer := Length(csvItems); if count > 0 then begin ShowMessage(Format('Anzahl: %d', [Length(csvItems)])); with csvItems[0] do ShowMessage(Format('%s-%d-%f-%f-%f-%d' , [DateToStr(created_at), entry_id, field1, field2, field3, field4.Trim.ToInteger])); end; end; Thomas |
AW: Thingspeak - Datenabruf
Willst du nun die CSV-Datei abrufen und auswerten oder die Werte des einzelnen Feldes wie im Eingangspost?
Wie ist die Struktur deiner Datenbanktabelle? |
AW: Thingspeak - Datenabruf
Liste der Anhänge anzeigen (Anzahl: 1)
Ach, d.h. ich muss mORMOT laden!?
Die mORMot2-master hab ich von GitHub heruntergeladen und enpackt. Anschliesend im RAD-Studio, wie unter ![]() Trotzdem meckert Delphi: 'mormot.core.base' nicht gefunden... Da hab ich wohl was falsch gemacht? |
AW: Thingspeak - Datenabruf
@Uwe: die Werte sollen in einem Array gespeichert werden, so wie im Code von Thomas :-)
Die Speicherung als csv war nur eine Zwischenlösung bedingt durch VBA. |
AW: Thingspeak - Datenabruf
Zitat:
![]() Bis bald... Thomas |
AW: Thingspeak - Datenabruf
Könnte es bei der SSL Fehlermeldung nicht einfach an fehlenden SSL DLL-Libraries oder Konfiguration liegen ?
|
AW: Thingspeak - Datenabruf
Zitat:
Zitat:
|
AW: Thingspeak - Datenabruf
Dein Problem ist SSL. In deinem Code wird kein SSL handler konfiguriert - ein kleiner Check per Browser zeigt,
dass TLS1.2 dort zumindest verwendet wird. Du müsstest die SSL handler in diese Richtung konfigurieren: function CreateCon : TIdHTTP; begin Result := TIdHTTP.Create(nil); sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Result); sslIOHandler.SSLOptions.Method := sslvTLSv1_2; Result.IOHandler := sslIOHandler; Result.ConnectTimeout := 6000; Result.ReadTimeout := 6000; end; Einfacher: Ich würde im url mal statt HTTPS:// nur HTTP:// verwenden. Der Server unterstützt http auch ;) |
AW: Thingspeak - Datenabruf
Zitat:
nur leider oft über die Konsole. (selten, indem man die CSV-Daten als einen VARCHAR/TEXT übergibt) Gut, man könnte im SQL auch den Text selber über Funktionen zerlegen und den Feldern für's INSERT übergeben, aber die SQlite-DB liegt auch vermutlich eh auf dem selben System, wie der Client, was das Problem einfacher lösen lassen könnte. Ja, natürlich kann man die CSV auch im Delphi-Code zerlegen und manuell Feld für Feld und Record (Zeile) für Record einzeln posten. :stupid: OK, es wäre so bissl langsamer, da viele DB-Aufrufe, aber es würde wohl auch bissl RAM/Cache sparen, wenn man es nicht im SQL löst. |
AW: Thingspeak - Datenabruf
Hallo, der Hinweis von rabatscher:
Zitat:
Mein weiterer Plan wäre jetzt aus
Code:
die Anweisung für die Datenbank zu erstellen.
resultStr
Jetzt möchte ich bei allen Bedanken und mangels Wissen mORMot für später aufheben. Danke Stefan |
AW: Thingspeak - Datenabruf
Zitat:
Delphi-Quellcode:
Damit sind alle Daten in der SQLite Datenbank. Auch die SQLite DB-Engine ist mit im Programm. Aufrufen kannst du die Funktion wie folgt:
uses
mormot.core.base, mormot.core.data, mormot.core.text, mormot.core.perf, mormot.core.search, mormot.core.unicode, mormot.core.variants, mormot.core.datetime, mormot.core.os, mormot.net.client, mormot.orm.base, mormot.orm.core, mormot.orm.sqlite3, mormot.rest.core, mormot.rest.sqlite3, mormot.db.raw.sqlite3, mormot.db.raw.sqlite3.static; type TCsvItem = packed record created_at: String; entry_id: Integer; field1: Double; field2: Double; field3: Double; field4: String; end; TCsvItems = array of TCsvItem; TOrmCsvItem = class(TOrm) private FCreatedAt: TDateTime; FField1: Double; FField2: Double; FField3: Double; FField4: Integer; published property CreatedAt: TDateTime read FCreatedAt write FCreatedAt; property Field1: Double read FField1 write FField1; property Field2: Double read FField2 write FField2; property Field3: Double read FField3 write FField3; property Field4: Integer read FField4 write FField4; end; function UpdateCsvItems(const pmcDBFileName: TFileName): Integer; const BASE_URL = 'https://api.thingspeak.com/channels/1671193/feeds.csv?start='; var csvItems: TCsvItems; begin Result := -1; var restClient: TRestClientDB := TRestClientDB.Create(TOrmModel.Create([TOrmCsvItem]), Nil, pmcDBFileName, TRestServerDB, {HandleUserAuthentication=}False); try restClient.Model.Owner := restClient; restClient.DB.Synchronous := smOff; restClient.DB.LockingMode := lmExclusive; restClient.Server.CreateMissingTables(0, [itoNoAutoCreateGroups, itoNoAutoCreateUsers]); var ormItem: TOrmCsvItem := TOrmCsvItem.Create; try var startTime: TDateTime := IncYear(Now, -100); var maxID: TID := restClient.TableMaxID(TOrmCsvItem); if (maxID >= 0) and restClient.Retrieve(maxID, ormItem) then startTime := ormItem.CreatedAt; var url: RawUtf8 := BASE_URL + DateTimeToIso8601(startTime, {Expanded=}True, 'T', {WithMS=}False, '"'); if DynArrayLoadCsv(csvItems, HttpGet(url), TypeInfo(TCsvItems)) then begin if Length(csvItems) = 0 then Exit; //=> restClient.BatchStart(TOrmCsvItem); for var i: Integer := 0 to High(csvItems) do begin if csvItems[i].entry_id <= maxID then Continue; with csvItems[i] do begin ormItem.IDValue := entry_id; ormItem.CreatedAt := Iso8601ToDateTime(StringToUtf8(created_at)); ormItem.Field1 := field1; ormItem.Field2 := field2; ormItem.Field3 := field3; ormItem.Field4 := field4.Trim.ToInteger; end; restClient.BatchAdd(ormItem, True, True); end; var insRowIDs: TIDDynArray; if restClient.BatchSend(insRowIDs) = HTTP_SUCCESS then Result := Length(insRowIDs); end; finally ormItem.Free; end; finally restClient.Free; end; end;
Delphi-Quellcode:
Bis bald...
var
timer: TPrecisionTimer; begin timer.Start; ShowMessage(Format('New insert: %d, Time: %s', [UpdateCsvItems(MakePath([Executable.ProgramFilePath, 'daten.db3'])), timer.Stop])); Thomas |
AW: Thingspeak - Datenabruf
Hallo Thomas, ich bekomme mORMot nicht zum Laufen.
Während des Compilierens erscheint die Fehlermeldung:
Code:
??? sicherlich weist Du auf Anhieb was ich wiedermal vergessen habe....?:?
[dcc32 Fehler] mormot.lib.z.pas(603): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibdeflate.obj'
[dcc32 Fehler] mormot.lib.z.pas(604): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibtrees.obj' [dcc32 Fehler] mormot.lib.z.pas(605): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibinflate.obj' [dcc32 Fehler] mormot.lib.z.pas(606): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibinftrees.obj' [dcc32 Fehler] mormot.lib.z.pas(607): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibadler32.obj' [dcc32 Fehler] mormot.lib.z.pas(608): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibcrc32.obj' [dcc32 Fehler] mormot.lib.z.pas(609): E1026 Datei nicht gefunden: '..\..\static\delphi\zlibinffast.obj' [dcc32 Fehler] mormot.lib.z.pas(178): E2065 Ungenügende Forward- oder External-Deklaration: 'crc32' [dcc32 Fehler] mormot.lib.z.pas(185): E2065 Ungenügende Forward- oder External-Deklaration: 'adler32' [dcc32 Fehler] mormot.lib.z.pas(642): E2065 Ungenügende Forward- oder External-Deklaration: 'deflate' [dcc32 Fehler] mormot.lib.z.pas(643): E2065 Ungenügende Forward- oder External-Deklaration: 'deflateEnd' [dcc32 Fehler] mormot.lib.z.pas(644): E2065 Ungenügende Forward- oder External-Deklaration: 'inflate' [dcc32 Fehler] mormot.lib.z.pas(645): E2065 Ungenügende Forward- oder External-Deklaration: 'inflateEnd' [dcc32 Fehler] mormot.lib.z.pas(647): E2065 Ungenügende Forward- oder External-Deklaration: 'deflateInit_' [dcc32 Fehler] mormot.lib.z.pas(649): E2065 Ungenügende Forward- oder External-Deklaration: 'inflateInit_' [dcc32 Fehler] mormot.lib.z.pas(652): E2065 Ungenügende Forward- oder External-Deklaration: 'deflateInit2_' [dcc32 Fehler] mormot.lib.z.pas(654): E2065 Ungenügende Forward- oder External-Deklaration: 'inflateInit2_' [dcc32 Fehler] mormot.lib.z.pas(655): E2065 Ungenügende Forward- oder External-Deklaration: 'get_crc_table' [dcc32 Fataler Fehler] mormot.core.zip.pas(797): F2063 Verwendete Unit 'mormot.lib.z.pas' kann nicht compiliert werden |
AW: Thingspeak - Datenabruf
Zitat:
![]() ![]() Bis bald... Thomas |
AW: Thingspeak - Datenabruf
Oh danke, das läuft jetzt.
Aber noch immer nicht fehlerfrei:
Code:
:cry:
[dcc32 Fehler] Project1.dpr(58): E2003 Undeklarierter Bezeichner: 'TFileName'
[dcc32 Fehler] Project1.dpr(65): E2250 Es gibt keine überladene Version von 'Create', die man mit diesen Argumenten aufrufen kann [dcc32 Fehler] Project1.dpr(74): E2003 Undeklarierter Bezeichner: 'IncYear' [dcc32 Fehler] Project1.dpr(96): E2018 Record, Objekt oder Klassentyp erforderlich [dcc32 Fehler] Project1.dpr(96): E2035 Nicht genügend wirkliche Parameter [dcc32 Fehler] Project1.dpr(114): E2029 Deklaration erwartet, aber Dateiende gefunden Misslungen |
AW: Thingspeak - Datenabruf
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Und auch Interface und Implementation Abschnitt schön getrennt.
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.DateUtils, Nachtrag: Habe besser gleich ein Beispiel Projekt (siehe Anhang) erstellt. Bis bald... Thomas |
AW: Thingspeak - Datenabruf
Hallo Thomas, das läuft... perfekt und danke.
einen entspannte Abend noch - Stefan |
AW: Thingspeak - Datenabruf
Dies sollte funktionieren - auch mit SSL (bis TLS 1.2):
Delphi-Quellcode:
Jedoch nur mit einer Indy-Version ab Ende 2014, Indy erzeugt dann den SSL-Handler, wenn das HTTPS Protokoll in der URL verwendet wird.
http := TIdHTTP.Create;
try resultStr := http.Get( 'https://api.thingspeak.com/channels/9/fields/1.json?results=10' ); finally http.Free; end; (Das ist für Testzwecke nützlich, da man weniger tippen muss. Hat man aber spezielle Anforderungen an die TLS-Konfiguration, geht es nur über den 'traditionellen' Weg) ![]() Allerdings: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz