[Docker / Container] echodevice

Begonnen von Sidey, 12 April 2026, 16:56:20

Vorheriges Thema - Nächstes Thema

Sidey

Supi,
Ich werde Perl Packages in FHEM bereitstellen,  damit wird die Integrstion einfacher denke ich.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp

FlatTV

Hi Sidey,

du warst ja gestern noch fleißig.
Ich gehe jetzt erstmal nicht produktiv mit dem ACS und warte.
So kann ich die Integration besser testen, ohne dich damit unter Druck setzen zu wollen 🙋

LG
Jörg
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 14 Juni 2026, 12:29:43Hi Sidey,

du warst ja gestern noch fleißig.
Ich gehe jetzt erstmal nicht produktiv mit dem ACS und warte.
So kann ich die Integration besser testen, ohne dich damit unter Druck setzen zu wollen 🙋

LG
Jörg

:)

Meine Idee ist, ein HTTPMod ohne at, notify usw.  kein setkeyvalue.
Damit wenig code und kein 99_myutils notwendig ist, stelle ich Integrations Packages bereit.

Die Packages können dann auch für eine native Integration in das echodevice Modul verwendet werden. Das könnte aber länger dauern bis es soweit ist :)

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp

FlatTV

Mir juckt es in den Fingern, sag einfach Bescheid wenn du jemanden zum testen brauchst.
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 14 Juni 2026, 13:46:33Mir juckt es in den Fingern, sag einfach Bescheid wenn du jemanden zum testen brauchst.

Zitat von: FlatTV am 14 Juni 2026, 13:46:33Mir juckt es in den Fingern, sag einfach Bescheid wenn du jemanden zum testen brauchst.

Du brauchst die Packages, aktuell liegen diese noch nicht im SVN:

update all https://raw.githubusercontent.com/fhem/alexa-cookie-service/refs/heads/main/lib/controls_alexa-cookie-service.txt
Und dann dieses HTTPMod: (Ein altes mit gleichem Namen am besten vorher löschen.)

ACS_httpmod_package


Da ich an Fehlermeldungen aus dem Container noch etwas geschraubt habe brauchst Du aktuell mindestens diese Version des Container Images:
ghcr.io/fhem/alexa-cookie-service:0.3.3

Damit wäre die Installation deutlich vereinfacht.
Wenn Du noch Anregungen hast, dann her damit :)


Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp

FlatTV

THX 🙏

Ich habe jetzt alle at und notify deaktiviert.
AlexaCookieService ist neu und läuft.

[2026-06-14T20:13:03,823 Europe/Berlin] [INFO] 172.27.0.2 - - [14/Jun/2026:18:13:03 +0000] "GET /api/cookie?save=45result.json HTTP/1.0" 200 11750 "-" "fhem" 2026.06.14 20:13:03.830 3: [AlexaAccount] [echodevice_NPMWaitForCookie] [unbekannt] write new refreshtoken
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

FlatTV

Das State Format gefällt mir noch nicht sooo.
Die Meldung durch loginUrl bleibt auch nach Login, refresh und Status stehen.
Internals:
   BUSY       0
   CFGFN     
   DEF        %%ACS_BASEURL%%/api/cookie/refresh?save=%%ACS_EXPORT_NAME%% 57600
   FUUID      6a2eeecb-f33f-b5a4-f594-7a36e57d9dc13ad2
   Interval   57600
   MainURL    %%ACS_BASEURL%%/api/cookie/refresh?save=%%ACS_EXPORT_NAME%%
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       AlexaCookieService
   NOTIFYDEV  global
   NR         51
   NTFY_ORDER 50-AlexaCookieService
   STATE      Please open http://192.168.178.188:58090/ with your browser and login to Amazon. The cookie will be output here after successfull login.
   TYPE       HTTPMOD
   eventCount 5
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       http://alexa-cookie-service:58080
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl http://alexa-cookie-service:58080/api/status
     header     x-auth-token: edde9d6bc89032430581637bdb11accd0d449f73bf88388da1af0a8027534038
     host       alexa-cookie-service
     httpheader HTTP/1.1 200 OK
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
Origin-Agent-Cluster: ?1
Referrer-Policy: no-referrer
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-XSS-Protection: 0
Content-Type: application/json; charset=utf-8
Content-Length: 4436
ETag: W/"1154-XvMMvLnLhVnCq9WNnjEYhXQL1V8"
Date: Sun, 14 Jun 2026 18:28:03 GMT
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    58080
     hu_portSfx :58080
     ignoreredirects 1
     loglevel   4
     path       /api/status
     protocol   http
     redirects  0
     timeout    30
     url        http://alexa-cookie-service:58080/api/status
     sslargs:
   QUEUE:
   READINGS:
     2026-06-14 20:28:03   LAST_REQUEST    get01
     2026-06-14 20:28:03   MATCHED_READINGS service_ok service_updated_at service_age_hours cookie_available refresh_available amazon_page
     2026-06-14 20:28:03   UNMATCHED_READINGS refresh_message export_name import_result export_import_result login_url last_error refresh_code refresh_action
     2026-06-14 20:28:03   amazon_page     amazon.de
     2026-06-14 20:28:03   cookie_available 1
     2026-06-14 20:26:44   export_import_result ok
     2026-06-14 20:25:14   last_error     
     2026-06-14 20:25:14   login_url       http://192.168.178.188:58090/
     2026-06-14 20:28:03   refresh_available 1
     2026-06-14 20:25:14   refresh_message Please open http://192.168.178.188:58090/ with your browser and login to Amazon. The cookie will be output here after successfull login.
     2026-06-14 20:28:03   service_age_hours 0.04
     2026-06-14 20:28:03   service_ok      1
     2026-06-14 20:28:03   service_updated_at 2026-06-14T18:25:56.266Z
   REQUEST:
     context    get
     data       
     header     x-auth-token: %%ACS_TOKEN%%
     ignoreredirects 0
     num        01
     retryCount 0
     type       get01
     url        %%ACS_BASEURL%%/api/status
     value     
   defptr:
     readingBase:
       amazon_page reading
       cookie_available reading
       export_import_result reading
       last_error reading
       login_url  reading
       refresh_available reading
       refresh_message reading
       service_age_hours reading
       service_ok reading
       service_updated_at reading
     readingNum:
       amazon_page 15
       cookie_available 13
       export_import_result 04
       last_error 17
       login_url  16
       refresh_available 14
       refresh_message 01
       service_age_hours 12
       service_ok 10
       service_updated_at 11
     readingOutdated:
     requestReadings:
       get01:
         amazon_page reading 15
         cookie_available reading 13
         refresh_available reading 14
         service_age_hours reading 12
         service_ok reading 10
         service_updated_at reading 11
       get02:
         last_error reading 17
         login_url  reading 16
         refresh_message reading 01
       get03:
         export_import_result reading 04
Attributes:
   baseUrl    http://alexa-cookie-service:58080
   echodevice AlexaAccount
   get01Name  status
   get01NoData 1
   get01URL   %%ACS_BASEURL%%/api/status
   get02Name  loginUrl
   get02NoData 1
   get02URL   %%ACS_BASEURL%%/api/cookie/login/url
   get03Name  exportCookie
   get03NoData 1
   get03URL   %%ACS_BASEURL%%/api/cookie?save=%%ACS_EXPORT_NAME%%
   getHeader1 x-auth-token: %%ACS_TOKEN%%
   reading01JSON message
   reading01Name refresh_message
   reading02JSON saveTarget
   reading02Name export_name
   reading02OExpr BEGIN { require FHEM::AlexaCookieService::EchodeviceImport; }; $val || FHEM::AlexaCookieService::EchodeviceImport::export_name_for_device(AttrVal($name,"echodevice","")) || ""
   reading03JSON saveTarget
   reading03Name import_result
   reading03OExpr $val ? (FHEM::AlexaCookieService::EchodeviceImport::trigger_import_for_device(AttrVal($name,"echodevice","")) || "ok") : "skipped"
   reading04JSON serviceUpdatedAt
   reading04Name export_import_result
   reading04OExpr $val ? (FHEM::AlexaCookieService::EchodeviceImport::trigger_import_for_device(AttrVal($name,"echodevice","")) || "ok") : "skipped"
   reading10JSON ok
   reading10Name service_ok
   reading11JSON updatedAt
   reading11Name service_updated_at
   reading12JSON ageHours
   reading12Name service_age_hours
   reading13JSON hasCookie
   reading13Name cookie_available
   reading14JSON hasRefreshToken
   reading14Name refresh_available
   reading15JSON amazonPage
   reading15Name amazon_page
   reading16JSON proxyUrl
   reading16Name login_url
   reading17JSON error
   reading17Name last_error
   reading18JSON code
   reading18Name refresh_code
   reading19JSON code
   reading19Name refresh_action
   reading19OExpr $val eq "NO_STATE" ? "Start Login Flow." : ($val ? "Refresh failed: $val" : "")
   replacement01Mode key
   replacement01Regex %%ACS_TOKEN%%
   replacement01Value alexa_cookie_service_token
   replacement02Mode expression
   replacement02Regex %%ACS_EXPORT_NAME%%
   replacement02Value FHEM::AlexaCookieService::EchodeviceImport::export_name_for_device(AttrVal($name,"echodevice",""))
   replacement03Mode expression
   replacement03Regex %%ACS_BASEURL%%
   replacement03Value AttrVal($name,"baseUrl","")
   requestData {}
   requestHeader1 x-auth-token: %%ACS_TOKEN%%
   requestHeader2 Content-Type: application/json
   room       Amazon
   set01Data  {}
   set01Method POST
   set01Name  refresh
   set01NoArg 1
   set01ParseResponse 1
   set01URL   %%ACS_BASEURL%%/api/cookie/refresh?save=%%ACS_EXPORT_NAME%%
   set02Data  {}
   set02Method POST
   set02Name  loginStart
   set02NoArg 1
   set02ParseResponse 1
   set02URL   %%ACS_BASEURL%%/api/cookie/login/start
   setHeader1 x-auth-token: %%ACS_TOKEN%%
   setHeader2 Content-Type: application/json
   showError  1
   showMatched 1
   stateFormat {my $msg=ReadingsVal($name,"refresh_message",""); my $act=ReadingsVal($name,"refresh_action",""); my $err=ReadingsVal($name,"last_error",""); my $imp=ReadingsVal($name,"import_result",""); my $age=ReadingsVal($name,"service_age_hours","-"); $msg ne "" ? $msg : $act ne "" ? $act : $err ne "" ? "error: $err" : $imp ne "" ? "refresh/import: $imp" : "age ${age}h"}
   timeout    30
   userattr   baseUrl echodevice
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 14 Juni 2026, 20:33:52Das State Format gefällt mir noch nicht sooo.
Die Meldung durch loginUrl bleibt auch nach Login, refresh und Status stehen.


Ja da habe ich so viel gebastelt, dass es nicht mehr so gut ist :)

Wie sieht es mit dieser angepassten Variante aus?

attr AlexaCookieService stateFormat {my $statusUpdatedAt=ReadingsTimestamp($name,"service_updated_at","");; my $msg=ReadingsVal($name,"refresh_message","");; my $msgTs=ReadingsTimestamp($name,"refresh_message","");; my $act=ReadingsVal($name,"refresh_action","");; my $actTs=ReadingsTimestamp($name,"refresh_action","");; my $err=ReadingsVal($name,"last_error","");; my $errTs=ReadingsTimestamp($name,"last_error","");; my $imp=ReadingsVal($name,"import_result","");; my $impTs=ReadingsTimestamp($name,"import_result","");; my $age=ReadingsVal($name,"service_age_hours","-");; ($msg ne "" && ($statusUpdatedAt eq "" || $msgTs ge $statusUpdatedAt)) ? $msg : ($act ne "" && ($statusUpdatedAt eq "" || $actTs ge $statusUpdatedAt)) ? $act : ($err ne "" && ($statusUpdatedAt eq "" || $errTs ge $statusUpdatedAt)) ? "error: $err" : ($imp ne "" && ($statusUpdatedAt eq "" || $impTs ge $statusUpdatedAt)) ? "refresh/import: $imp" : "age ${age}h"}
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp

FlatTV

Hallo Sidey,
erstmal - ,,haste gut gemacht".

Ein wenig irreführend ist noch, wer hier was macht.
Das ist ein Auszug aus dem fhem-Log
2026.06.15 10:50:35.919 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 11:41:37.003 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 12:02:18.333 3: [AlexaAccount] [echodevice_LoginStart] Alter COOKIE=56134/6000 Refresh Cookie!
2026.06.15 12:02:18.345 3: [AlexaAccount] [echodevice_NPMLoginRefresh] alexa-cookie modul not found
2026.06.15 12:11:24.226 3: [AlexaAccount] [echodevice_NPMWaitForCookie] [NPM Login Refresh Mon Jun 15 12:02:18 2026] write new refreshtoken
2026.06.15 12:25:37.959 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 14:41:41.497 3: [AlexaAccount] [echodevice_setState] to connected

Um 12:02 macht der ACS jedenfalls nichts, die Meldungen kommen aus dem 37_echodevice.pm
[2026-06-15T12:00:55,626 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:00:55 +0000] "GET /healthz HTTP/1.1" 200 4437 "-" "-"
[2026-06-15T12:01:25,966 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:01:25 +0000] "GET /healthz HTTP/1.1" 200 4437 "-" "-"
[2026-06-15T12:01:56,368 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:01:56 +0000] "GET /healthz HTTP/1.1" 200 4436 "-" "-"
[2026-06-15T12:02:26,699 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:02:26 +0000] "GET /healthz HTTP/1.1" 200 4437 "-" "-"
[2026-06-15T12:02:57,028 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:02:57 +0000] "GET /healthz HTTP/1.1" 200 4437 "-" "-"
[2026-06-15T12:03:27,421 Europe/Berlin] [INFO] 127.0.0.1 - - [15/Jun/2026:10:03:27 +0000] "GET /healthz HTTP/1.1" 200 4437 "-" "-"

Um 12:11 Uhr gehts dann mit dem ACS los
[2026-06-15T12:11:23,214 Europe/Berlin] [INFO] Starting refresh (api)
[2026-06-15T12:11:23,215 Europe/Berlin] [INFO] Alexa-Cookie: Use as Login-Amazon-URL: amazon.de
[2026-06-15T12:11:23,216 Europe/Berlin] [INFO] Alexa-Cookie: Use as Base-Amazon-URL: amazon.com
...
[2026-06-15T12:11:24,202 Europe/Berlin] [INFO] Refresh finished (api) in 988 ms
[2026-06-15T12:11:24,214 Europe/Berlin] [INFO] Refresh request handled in 1001 ms (saveTarget=45result.json)
[2026-06-15T12:11:24,216 Europe/Berlin] [INFO] 172.27.0.2 - - [15/Jun/2026:10:11:24 +0000] "POST /api/cookie/refresh?save=45result.json HTTP/1.0" 200 4362 "-" "fhem"

Der AlexaAccount steht ebenfalls auf intervallogin 57660.
Sollte man daran drehen oder fällt dir noch was schickes ein.

LG
Jörg
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

FlatTV

Gibt es eigentlich ungefähr sowas schon?

98_Template.pmdefine <NAME> Template <TYPE> <TEMPLATE>FHEM/
 ├─ 98_Template.pm
 └─ templates/
     ├─ HTTPMOD/
     │   ├─ AlexaCookieService.cfg
     │   └─ irgendwas.cfg

Dann wäre es möglich, die cfg als Template für die Config zu nehmen.
define AlexaCookieService Template HTTPMOD AlexaCookieService
... ich schweife ab.
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 15 Juni 2026, 17:21:17Hallo Sidey,
erstmal - ,,haste gut gemacht".

Ein wenig irreführend ist noch, wer hier was macht.
Das ist ein Auszug aus dem fhem-Log
2026.06.15 10:50:35.919 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 11:41:37.003 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 12:02:18.333 3: [AlexaAccount] [echodevice_LoginStart] Alter COOKIE=56134/6000 Refresh Cookie!
2026.06.15 12:02:18.345 3: [AlexaAccount] [echodevice_NPMLoginRefresh] alexa-cookie modul not found
2026.06.15 12:11:24.226 3: [AlexaAccount] [echodevice_NPMWaitForCookie] [NPM Login Refresh Mon Jun 15 12:02:18 2026] write new refreshtoken
2026.06.15 12:25:37.959 3: [AlexaAccount] [echodevice_setState] to connected
2026.06.15 14:41:41.497 3: [AlexaAccount] [echodevice_setState] to connected

Der AlexaAccount steht ebenfalls auf intervallogin 57660.
Sollte man daran drehen oder fällt dir noch was schickes ein.

Das ist mir zunächst nicht aufgefallen :)  Ist bei mir aber exakt genau so, weil alle 6000 Sekunden das Alter vom gespeicherten cookie geprüft wird.

Den Intervall kann man seltsamerweise mit einem npm Attribut (hat mit npm nichts zu tun) ändern:
attr AlexaAccount npm_refresh_intervall 60060
Mit dem Attribut wird auch nicht direkt das refresh Intervall gesteuert, sondern das Mindestalter, bevor ein refresh ausgelöst wird.
Kurzum, wenn das Attribut größer als der zyklische refresh von acs ist, dann sollte es zu keiner Meldung im Log bei verbose 3 kommen.


Zitat von: FlatTV am 15 Juni 2026, 18:03:38Gibt es eigentlich ungefähr sowas schon?

FHEM/
 ├─ 98_Template.pm
 └─ templates/
     ├─ HTTPMOD/
     │   ├─ AlexaCookieService.cfg
     │   └─ irgendwas.cfg

So gibt es das leider derzeit nicht, wäre aber wirklich eine besser verwaltbare Lösung als die heutigen Templat Optionen..

Wenn wir einen stabilen Stand haben, kann ich ein Template für die Aufnahme vorschlagen.

Der Copy&Paste Ansatz ist aber aktuell auch nicht so übel finde ich für gefühlt ~3 Anwender.
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp

FlatTV

Zitat von: Sidey am 15 Juni 2026, 22:23:17Der Copy&Paste Ansatz ist aber aktuell auch nicht so übel finde ich für gefühlt ~3 Anwender.

Auch wieder wahr ^^
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)