[Gelöst] CUxD Exec sendet URL zwei Mal?

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
Yosh
Beiträge: 98
Registriert: 24.07.2021, 23:30
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 11 Mal

[Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Yosh » 30.05.2025, 21:55

Moin,

Ich habe die Fahrtzeitabfrage aus diesem Thread "entkoppelt" in ein Frage- und ein Antwortprogramm, so wie hier auch vielfach empfohlen. Nun erschienen mir die von Google gemessenen Anfragen gegenüber den bei mir im Syslog protokollierten Anfragen aber zu hoch, um genau zu sein in der Regel doppelt so hoch. Nach dem Ausschließen, dass ich das Programm re-trigger oder sonstwie zwei mal aufrufe habe ich eben noch mal einen Test gemacht und das Skript direkt aus der SDV heraus laufen lassen.

Ausgangssituation:
Screenshot 2025-05-30 212202.png
Screenshot 2025-05-30 212202.png (23.24 KiB) 532 mal betrachtet
6 Anfragen in der letzten Stunde laut Google

Nun starte ich in der SDV das Script im Programm, welches die Anfrage an die Distance API sendet (Api Key und Adressen ersetzt):

Code: Alles auswählen

!- Schickt die Abfragen für die Dauer an Google

! ------  Google Maps Traffic API 23.06.2019  Vers. 1.1 -----------------------------------------------------------
! by kafetzke

string execdevice = "CUxD.CUX2801001:7";
string apikey = "API Key";
string zuhause = "Zu Hause";
string arbeit = "Arbeit";
boolean richtung = dom.GetObject("verkehr_richtung").Value();

if (richtung){
   string url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" # zuhause # "\&destinations=" # arbeit # "\&mode=driving\&language=de-DE\&departure_time=now\&key=" # apikey;
} else {
   string url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" # arbeit # "\&destinations=" # zuhause # "\&mode=driving\&language=de-DE\&departure_time=now\&key=" # apikey;
}

string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
string cmd = downloader # " " # url;

!-----------  Dauer mit Verkehr Joerg --------------

dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
dom.GetObject(execdevice # ".CMD_RUNS").State(1);
dom.GetObject("verkehr_timestamp").State(system.Date("%H:%M"));     
Das Syslog meldet, dass das Verarbeitungsprogramm angestoßen worden ist:
syslog.png
syslog.png (7.17 KiB) 532 mal betrachtet
Das Programm enthält folgendes Script:

Code: Alles auswählen

! ------  Google Maps Traffic API 23.06.2019  Vers. 1.1 -----------------------------------------------------------
! by kafetzke

string execdevice = "CUxD.CUX2801001:7";
string stdout = "";
var value;
string temp_string;

!------------------------------------------------------------------------------------------------------------
! Los gehts...
!------------------------------------------------------------------------------------------------------------

!-----------  Dauer mit Verkehr --------------

stdout = dom.GetObject(execdevice # ".CMD_RETS").State();
string keyword = "duration_in_traffic";

if (stdout)
{
  temp_string = stdout.Substr(stdout.Find(keyword));

  if (temp_string <> "")
  {
    temp_string = temp_string.Substr(temp_string.Find("value")+8);
    ! Diese schreibweise sorgt für einen Integer-Wert
    value = 0 + temp_string.Substr(0,temp_string.Find("}"));
    verkehr_dauer = (value/60).ToInteger();
  }
}

dom.GetObject("SysLog").State(dom.GetObject("$this$").Name() #" wurde am "#system.Date("%d.%m. %H:%M:%S Uhr") #" beendet");
Google hat jetzt 2 Anfragen mehr?
Screenshot 2025-05-30 212524.png
Screenshot 2025-05-30 212524.png (18.12 KiB) 532 mal betrachtet
Und eventuell meint auch das CUxD Log, dass es 2x gesendet hat?
cuxd_log.png
cuxd_log.png (12.59 KiB) 532 mal betrachtet
Der Vollständigkeit halber hier noch das Verarbeitungsprogramm:
ccu Verarbeiten Programm.png
Ist das so, dass bei dem "Entkoppeln" die Ziel-URL 2x aufgerufen wird? Mache ich etwas falsch? Gibt es eine andere Möglichkeit das Abfragen von Daten zu entkoppeln (ich möchte vermeiden, dass lange Antwortzeiten die CCU stocken lassen).

Danke für Eure Erklärungen, Hilfen und Tips.
Yosh
Zuletzt geändert von Yosh am 02.06.2025, 19:49, insgesamt 1-mal geändert.
Umgebung: CCU3 (FW 3.69.7) / FB 7590 / Hue Bridge mit 17 Lampen (Hue, TRÅDFRI, Osram) / 6x Amazon Echo
Geräte: 505 Kanäle in 83 Geräten // 42 Kanäle in 6 Heizgruppen // 140 CUxD-Kanäle in 20 CUxD-Geräten
Addons: NEO Server 2.12.2 / CUx-Daemon 2.10.1 / CUxD-Highcharts 1.4.5 / Programme drucken 2.6 / HM Pdetect 1.15 / Philips Hue 3.2.5 / HQ WebUI 2.5.9
API Keys: Google (Script , Maps, Calendar) / AccuWeather / Tankerkönig / PushOver
Sonstige: SDV v4.09.04G / AIO Creator NEO v3.0.3 mit 2x Samsung S20FE und 1x Tab A6 / Mediola Cloud / Alexa.sh

rentier-s
Beiträge: 650
Registriert: 19.06.2017, 09:24
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 24 Mal
Danksagung erhalten: 110 Mal

Re: CUxD Exec sendet URL zwei Mal?

Beitrag von rentier-s » 02.06.2025, 16:24

Nach der 1 an CMD_QUERY_RET führt CMD_RETS innerhalb von 10 Sekunden CMD_SHORT aus, das Du vorher schon mit CMD_RUNS gestartet hast.

Dein Vorhaben macht so wenig Sinn, CMD_RUNS schreibt nicht das Ergebnis des Aufrufs nach CMD_RETS, sondern den Exit-Status.

Benutzeravatar
Yosh
Beiträge: 98
Registriert: 24.07.2021, 23:30
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 11 Mal

Re: CUxD Exec sendet URL zwei Mal?

Beitrag von Yosh » 02.06.2025, 19:48

Moin,

Ok, dann habe ich das Beispiel im Handbuch auf Seite 115 zum asychronen Verarbeiten komplett falsch verstanden :(

Eine Aufteilung in zwei Programme (eines, dass die Anfrage schickt und sofort weiter macht und eines, dass auf die Antwort wartet und diese dann verarbeitet) funktioniert offensichtlich so nicht. Ich werde mal im Hauptforum fragen, ob und wenn ja wie sich so etwas realisieren lässt.

Vielen Dank für die Erklärung!

Gruß,
Yosh
Umgebung: CCU3 (FW 3.69.7) / FB 7590 / Hue Bridge mit 17 Lampen (Hue, TRÅDFRI, Osram) / 6x Amazon Echo
Geräte: 505 Kanäle in 83 Geräten // 42 Kanäle in 6 Heizgruppen // 140 CUxD-Kanäle in 20 CUxD-Geräten
Addons: NEO Server 2.12.2 / CUx-Daemon 2.10.1 / CUxD-Highcharts 1.4.5 / Programme drucken 2.6 / HM Pdetect 1.15 / Philips Hue 3.2.5 / HQ WebUI 2.5.9
API Keys: Google (Script , Maps, Calendar) / AccuWeather / Tankerkönig / PushOver
Sonstige: SDV v4.09.04G / AIO Creator NEO v3.0.3 mit 2x Samsung S20FE und 1x Tab A6 / Mediola Cloud / Alexa.sh

rentier-s
Beiträge: 650
Registriert: 19.06.2017, 09:24
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 24 Mal
Danksagung erhalten: 110 Mal

Re: CUxD Exec sendet URL zwei Mal?

Beitrag von rentier-s » 03.06.2025, 08:34

Yosh hat geschrieben:
02.06.2025, 19:48
dann habe ich das Beispiel im Handbuch auf Seite 115 zum asychronen Verarbeiten komplett falsch verstanden
So ganz falsch auch wieder nicht. Man kann auf diese Weise durchaus längere Aktionen im Hintergrund laufen lassen und dann später auf die Fertigstellung reagieren. Das Problem ist, Du bekommt so eben nur den Exit-Code der ersten Prozedur, sozusagen nur die Info, dass es jetzt fertig ist. An die Ausgabe, also die Antwort der google API, kommst Du so nicht ran, weil RUNS diese nicht abwartet.

Für eine wirklich asynchrone Verarbeitung müsste curl die Ausgabe zum Beispiel in eine Datei schreiben. Ins addon Verzeichnis geschrieben, könntest Du sie danach mit einem curl localhost wieder einlesen.
Oder, was vielleicht klappen könnte, die Ausgabe an extra/timer.tcl übergeben und mittels derer in eine Systemvariable schreiben lassen.

Aber probier doch erstmal mit einem relativ kurzen timeout und evtl. retry im curl Aufruf. Das google Zeug antwortet in aller Regel doch ziemlich schnell, schlimmsten Falles wird alles andere halt mal 3 Sekunden verzögert verarbeitet, Du wirst die Abfrage wohl nicht 1000x am Tag machen.

Benutzeravatar
Yosh
Beiträge: 98
Registriert: 24.07.2021, 23:30
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 11 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Yosh » 03.06.2025, 20:10

Moin,

nochmal Danke für die Tips und Erklärung!

1000x am Tag würde die Freigrenze definitv spregen ;-) Ich frage jede Stunde und zwischen 6:10 und 8:50 (meine Frau fährt früher als ich zur Arbeit) alle 10 Minuten 2 Wegstrecken ab. Also: 2 x (24 + 3 x 6 - 2) = 80 Abfragen am Tag. Das sind dann maximal 2.4k Abfragen im Monat und damit weit unter den 10k Freien. Dateien auf die SD-Karte schreiben möchte ich trotzdem nicht.

curl --help gibt mir als Timeout Parameter "-m". Ich interpretiere das so, dass wenn ich

Code: Alles auswählen

string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl"; 
in

Code: Alles auswählen

string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -m 10 "; 
ändere, das Script nach spätestens 10 Sekunden weiter geht? Solange ist ja auch der CUxD Parameter gültig.

Den Fehler mit dem "aufsplitten" habe ich bei allen API Abfragen gemacht (accu weather, tankerkönig und google script für den Kalender) und bin dabei alles umzubauen.

Gruß,
Yosh
Zuletzt geändert von Yosh am 03.06.2025, 20:15, insgesamt 1-mal geändert.
Umgebung: CCU3 (FW 3.69.7) / FB 7590 / Hue Bridge mit 17 Lampen (Hue, TRÅDFRI, Osram) / 6x Amazon Echo
Geräte: 505 Kanäle in 83 Geräten // 42 Kanäle in 6 Heizgruppen // 140 CUxD-Kanäle in 20 CUxD-Geräten
Addons: NEO Server 2.12.2 / CUx-Daemon 2.10.1 / CUxD-Highcharts 1.4.5 / Programme drucken 2.6 / HM Pdetect 1.15 / Philips Hue 3.2.5 / HQ WebUI 2.5.9
API Keys: Google (Script , Maps, Calendar) / AccuWeather / Tankerkönig / PushOver
Sonstige: SDV v4.09.04G / AIO Creator NEO v3.0.3 mit 2x Samsung S20FE und 1x Tab A6 / Mediola Cloud / Alexa.sh

Benutzeravatar
MichaelN
Beiträge: 11546
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 802 Mal
Danksagung erhalten: 1984 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von MichaelN » 03.06.2025, 20:14

Hier noch etwas Lesestoff:
viewtopic.php?f=37&t=74315#p719323
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Baxxy
Beiträge: 13437
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 821 Mal
Danksagung erhalten: 2953 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Baxxy » 03.06.2025, 20:22

Ach das ist ja schon wieder lange her. :wink:
Ich nutze das aber immer noch grundsätzlich so, nur das ich inzwischen alles in einem Programm erledige. :)

Benutzeravatar
Yosh
Beiträge: 98
Registriert: 24.07.2021, 23:30
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 11 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Yosh » 03.06.2025, 20:38

Moin Michael,

Danke für den Link. Ich werde zusätzlich noch den Timeout Parameter in den CUxD Exec Kanälen setzten. Das übermäßige Schreiben auf die SD Karte möchte ich vermeiden, auch wenn es sicherlich die "entkoppelste" Lösung wäre.

Auf der anderen Seite hatte ich selbst bei dem doppelten Aufruf der URL, auch wenn es ein Fehler war, nicht wirklich Hänger in der CCU, so dass ich jetzt alles wieder in ein Skript baue.

Gruß,
Yosh
Umgebung: CCU3 (FW 3.69.7) / FB 7590 / Hue Bridge mit 17 Lampen (Hue, TRÅDFRI, Osram) / 6x Amazon Echo
Geräte: 505 Kanäle in 83 Geräten // 42 Kanäle in 6 Heizgruppen // 140 CUxD-Kanäle in 20 CUxD-Geräten
Addons: NEO Server 2.12.2 / CUx-Daemon 2.10.1 / CUxD-Highcharts 1.4.5 / Programme drucken 2.6 / HM Pdetect 1.15 / Philips Hue 3.2.5 / HQ WebUI 2.5.9
API Keys: Google (Script , Maps, Calendar) / AccuWeather / Tankerkönig / PushOver
Sonstige: SDV v4.09.04G / AIO Creator NEO v3.0.3 mit 2x Samsung S20FE und 1x Tab A6 / Mediola Cloud / Alexa.sh

Benutzeravatar
Baxxy
Beiträge: 13437
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 821 Mal
Danksagung erhalten: 2953 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Baxxy » 03.06.2025, 20:49

Ich lege die Dateien im temporären Dateisystem ab, was quasi ein RAM-Drive ist. Da wird nix auf die SD-Karte geschrieben.

Die Abfrage von Historian-Daten dauert gerne mal 5-10s weil der Historian wohl ab und an ein Nickerchen macht. viewtopic.php?f=38&t=85368&p=833009&hil ... an#p833009
Da kommt man um eine asynchrone Abfrage nicht herum wenn man die ReGa nicht blockieren will.

Benutzeravatar
Yosh
Beiträge: 98
Registriert: 24.07.2021, 23:30
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 11 Mal

Re: [Gelöst] CUxD Exec sendet URL zwei Mal?

Beitrag von Yosh » 03.06.2025, 21:11

Moin Baxxy,

hehe, ich bin im Job der Typ, der die Spec schreibt - mein Kollege programmiert das dann und öfter verstehe ich auch was er tut - gefährliches Halb-Wissen ;-)

Wenn ich Dich richtig verstehe, würde ich die curl Abfrage mit sowas wie " > /tmp/maps_answer.txt" umleiten.

Im Verarbeitungsprogramm dann wie in dem von Michael verlinkten Thread beschrieben mit

Code: Alles auswählen

string answer;
var raw_data = system.Exec("cat /tmp/maps_answer.txt", &answer);
auslesen und dann parsen?

Gruß,
Yosh
Umgebung: CCU3 (FW 3.69.7) / FB 7590 / Hue Bridge mit 17 Lampen (Hue, TRÅDFRI, Osram) / 6x Amazon Echo
Geräte: 505 Kanäle in 83 Geräten // 42 Kanäle in 6 Heizgruppen // 140 CUxD-Kanäle in 20 CUxD-Geräten
Addons: NEO Server 2.12.2 / CUx-Daemon 2.10.1 / CUxD-Highcharts 1.4.5 / Programme drucken 2.6 / HM Pdetect 1.15 / Philips Hue 3.2.5 / HQ WebUI 2.5.9
API Keys: Google (Script , Maps, Calendar) / AccuWeather / Tankerkönig / PushOver
Sonstige: SDV v4.09.04G / AIO Creator NEO v3.0.3 mit 2x Samsung S20FE und 1x Tab A6 / Mediola Cloud / Alexa.sh

Antworten

Zurück zu „CUxD“