Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Ausgabe Name des Senders

NEWS

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    766

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.4k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    5.5k

Ausgabe Name des Senders

Geplant Angeheftet Gesperrt Verschoben Blockly
41 Beiträge 7 Kommentatoren 880 Aufrufe 6 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • matze55M Offline
    matze55M Offline
    matze55
    schrieb zuletzt editiert von
    #29
    [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{0_userdata.0.enigma2.epg_html}"},"style":{"left":"73px","top":"53px","width":"1039px","height":"385px","border-width":"1px","border-style":"solid","border-color":"#ffffff","border-radius":"8px"},"widgetSet":"basic"}]
    

    Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
    Tapo C210 Cam
    WLED Steuerung über lcdwiki

    OliverIOO 1 Antwort Letzte Antwort
    0
    • matze55M matze55
      [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{0_userdata.0.enigma2.epg_html}"},"style":{"left":"73px","top":"53px","width":"1039px","height":"385px","border-width":"1px","border-style":"solid","border-color":"#ffffff","border-radius":"8px"},"widgetSet":"basic"}]
      
      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb zuletzt editiert von OliverIO
      #30

      @matze55

      das ist wieder der widget export
      den inhalt von
      0_userdata.0.enigma2.epg_html

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      1 Antwort Letzte Antwort
      0
      • matze55M Offline
        matze55M Offline
        matze55
        schrieb zuletzt editiert von
        #31
        Wert:
        <style> .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; } .e2-epg-table tr { border-bottom: 1px solid #444444; } .e2-epg-table tr:nth-child(even) { background-color: rgba(32,32,32,0.5); } .e2-epg-table td { padding: 10px 8px; vertical-align: top; } .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; } .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; } .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; } .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; } </style> <table class="e2-epg-table"> </table>
        

        So richtig?

        Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
        Tapo C210 Cam
        WLED Steuerung über lcdwiki

        OliverIOO U 3 Antworten Letzte Antwort
        0
        • matze55M matze55
          Wert:
          <style> .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; } .e2-epg-table tr { border-bottom: 1px solid #444444; } .e2-epg-table tr:nth-child(even) { background-color: rgba(32,32,32,0.5); } .e2-epg-table td { padding: 10px 8px; vertical-align: top; } .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; } .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; } .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; } .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; } </style> <table class="e2-epg-table"> </table>
          

          So richtig?

          OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb zuletzt editiert von OliverIO
          #32

          @matze55 sagte:

          das html element ist leer

          <table class="e2-epg-table"> </table>
          

          das bedeutet das die folgende zeile nicht ausgeführt wird

          epgData.events.forEach(event => {

          weil epgData.events keine daten enthält oder kein array ist
          mach mal im javascript editor davor ein

          console.log(epgData.events);

          im log, also im unteren bereich sollten dann daten oder nix ausgegeben werden.

          alternativ auch
          console.log(epgData);

          Meine Adapter und Widgets
          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
          Links im Profil

          1 Antwort Letzte Antwort
          0
          • matze55M matze55
            Wert:
            <style> .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; } .e2-epg-table tr { border-bottom: 1px solid #444444; } .e2-epg-table tr:nth-child(even) { background-color: rgba(32,32,32,0.5); } .e2-epg-table td { padding: 10px 8px; vertical-align: top; } .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; } .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; } .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; } .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; } </style> <table class="e2-epg-table"> </table>
            

            So richtig?

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb zuletzt editiert von OliverIO
            #33

            @matze55

            der fehler liegt wahrscheinlich an der folgenden zeile

            if (!event.sname || !event.event_title) return;

            prüfe mal ob die attribute im event objekt tatsächlich so heißen.
            evtl heißt

            event.event_title

            doch nur

            event.title
            ?

            das selbe dann auch mit
            event.event_start
            event.event_description

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            • matze55M matze55
              Wert:
              <style> .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; } .e2-epg-table tr { border-bottom: 1px solid #444444; } .e2-epg-table tr:nth-child(even) { background-color: rgba(32,32,32,0.5); } .e2-epg-table td { padding: 10px 8px; vertical-align: top; } .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; } .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; } .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; } .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; } </style> <table class="e2-epg-table"> </table>
              

              So richtig?

              U Offline
              U Offline
              UlliJ
              schrieb zuletzt editiert von
              #34

              @matze55

              die Box bzw. Openwebif liefert über /api/... eigentlich ein Json als Antwort (zumindest die VU+ Box hier). XML kommt über /web/...

              Probier mal im Browser, ob die Antworten überhaupt kommen. Adresse anpassen nicht vergessen:

              http://192.168.xx.xx/api/getservices 
              

              sollte ähnliches liefern:

              {
                  "services": [
                      {
                          "servicereference": "1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.favourites.tv\" ORDER BY bouquet",
                          "program": 0,
                          "servicename": "Favourites (TV)",
                          "pos": 1
                      },
                      {
                          "servicereference": "1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.vti_192_000.tv\" ORDER BY bouquet",
                          "program": 0,
                          "servicename": "German Free SD",
                          "pos": 2
                      },
                      {
                          "servicereference": "1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.vti_192_001.tv\" ORDER BY bouquet",
                          "program": 0,
                          "servicename": "German Free HD",
                          "pos": 3
                      },
              

              Die Epg Daten für jetzt kommen dann mit (1. Bouquet)

              http://192.168.xx.xx/api/epgnow?bRef=1:7:1:0:0:0:0:0:0:0:
              
              {
                  "events": [
                      {
                          "sname": ".",
                          "title": null,
                          "begin_timestamp": null,
                          "now_timestamp": 1785390224,
                          "sref": "1:0:1:300:7:85:C00000:0:0:0:",
                          "id": null,
                          "duration_sec": null,
                          "shortdesc": null,
                          "longdesc": null
                      },
                      {
                          "sname": "CGTN Documentary",
                          "title": null,
                          "begin_timestamp": null,
                          "now_timestamp": 1785390224,
                          "sref": "1:0:1:1B00:3FE:1:C00000:0:0:0:",
                          "id": null,
                          "duration_sec": null,
                          "shortdesc": null,
                          "longdesc": null
                      },
                      {
                          "sname": "Comedy Central HD.",
                          "title": null,
                          "begin_timestamp": null,
                          "now_timestamp": 1785390224,
                          "sref": "1:0:1:7000:436:1:C00000:0:0:0:",
                          "id": null,
                          "duration_sec": null,
                          "shortdesc": null,
                          "longdesc": null
                      },...
              ], "result": true}
              

              danach oder gleich die Logausgaben von @oliverio einbauen

              Proxmox auf iNuc, lxc für IoB, InfluxDB2, Grafana, u.a. *** Homematic & Homematic IP, Shellies, Zigbee etc

              1 Antwort Letzte Antwort
              0
              • matze55M Offline
                matze55M Offline
                matze55
                schrieb zuletzt editiert von
                #35

                Guten morgen....Danke für die Hinweise und eure Antworten. Der entscheidente Tip kamm von @oliverio. Die Sendernamen zeigen an und auch der Titel der Sender. Und ja @ullij die Daten kommen alle an, die stehen in der API.
                Nur wo es jetzt noch ein wenig hängt das ist die Uhrzeit da klemmt es noch.

                Geändert:

                const startTime = new Date(event.start * 1000);
                        const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                

                Vorher:

                const startTime = new Date(event.event_start * 1000);
                        const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                

                Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
                Tapo C210 Cam
                WLED Steuerung über lcdwiki

                OliverIOO U 2 Antworten Letzte Antwort
                0
                • matze55M matze55

                  Guten morgen....Danke für die Hinweise und eure Antworten. Der entscheidente Tip kamm von @oliverio. Die Sendernamen zeigen an und auch der Titel der Sender. Und ja @ullij die Daten kommen alle an, die stehen in der API.
                  Nur wo es jetzt noch ein wenig hängt das ist die Uhrzeit da klemmt es noch.

                  Geändert:

                  const startTime = new Date(event.start * 1000);
                          const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                  

                  Vorher:

                  const startTime = new Date(event.event_start * 1000);
                          const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                  
                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb zuletzt editiert von
                  #36

                  @matze55

                  Und in welcher Zeile ist das Problem?
                  Gibt es einen Fehler?
                  Wird in irgendeiner Zeile etwas nicht erwartetes zurückgegeben?

                  Hast du log Ausgaben eingebaut.
                  Leider weiß ich nicht, wie die Daten tatsächlich aussehen.
                  Du hast zwar event.event_start geändert.
                  Oben sehe ich aber, dass es eher now_timestamp heißt.
                  Aber das sind die Daten von jemand anderen, keine Ahnung, wie es bei dir aussieht.

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  1 Antwort Letzte Antwort
                  0
                  • matze55M Offline
                    matze55M Offline
                    matze55
                    schrieb zuletzt editiert von
                    #37

                    Ich habe deine Änderungen übernommen. Nur das mit dem Timestamp da stimmt was nicht.
                    In der Json zeigt das Timestamp an nur in der Html nicht. Name des senders Korrekt. Titel des Senders Korrekt.

                    Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
                    Tapo C210 Cam
                    WLED Steuerung über lcdwiki

                    1 Antwort Letzte Antwort
                    0
                    • matze55M matze55

                      Guten morgen....Danke für die Hinweise und eure Antworten. Der entscheidente Tip kamm von @oliverio. Die Sendernamen zeigen an und auch der Titel der Sender. Und ja @ullij die Daten kommen alle an, die stehen in der API.
                      Nur wo es jetzt noch ein wenig hängt das ist die Uhrzeit da klemmt es noch.

                      Geändert:

                      const startTime = new Date(event.start * 1000);
                              const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                      

                      Vorher:

                      const startTime = new Date(event.event_start * 1000);
                              const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                      
                      U Offline
                      U Offline
                      UlliJ
                      schrieb zuletzt editiert von
                      #38

                      @matze55 sagte:

                      die stehen in der API

                      dann zeig doch mal wie die Attribute des Json aussehen. Dann kann Dir auch jemand helfen

                      Proxmox auf iNuc, lxc für IoB, InfluxDB2, Grafana, u.a. *** Homematic & Homematic IP, Shellies, Zigbee etc

                      1 Antwort Letzte Antwort
                      0
                      • matze55M Offline
                        matze55M Offline
                        matze55
                        schrieb zuletzt editiert von
                        #39

                        Der gesamte Code so wie er jetzt aussieht:

                        // --- KONFIGURATION GIGABLUE ENIGMA2 BOX---
                        const BOX_IP = 'XXX.XXX.XXX.XX'; // IP deiner Enigma2 Box bitte anpassen
                        const TARGET_JSON_DP = '0_userdata.0.enigma2.epg_json'; //Datenpunkt Json
                        const TARGET_HTML_DP = '0_userdata.0.enigma2.epg_html'; //Datenpunkt Html
                        // ---------------------
                        
                        const axios = require('axios');
                        
                        // Datenpunkte erstellen, falls sie fehlen
                        await createStateAsync(TARGET_JSON_DP, { name: 'Enigma2 EPG JSON', type: 'string', role: 'json', read: true, write: false });
                        await createStateAsync(TARGET_HTML_DP, { name: 'Enigma2 EPG HTML für VIS', type: 'string', role: 'html', read: true, write: false });
                        
                        // Holt vollautomatisch die exakte ID des ersten TV-Bouquets
                        async function fetchValidBouquetRef() {
                            try {
                                const response = await axios.get(`http://${BOX_IP}/api/getallservices`, { timeout: 3000 });
                                
                                if (response && response.data && response.data.services) {
                                    const services = response.data.services;
                                    
                                    // Fall 1: API liefert ein direktes Array
                                    if (Array.isArray(services) && services.length > 0) {
                                        return services[0].servicereference;
                                    } 
                                    // Fall 2: API liefert ein verschachteltes Objekt
                                    if (services.servicereference) {
                                        return services.servicereference;
                                    }
                                }
                            } catch (e) {
                                log(`Enigma2: Fehler beim automatischen Bouquet-Abruf: ${e.message}`, 'warn');
                            }
                            return null;
                        }
                        
                        function buildHtmlTable(epgData) {
                            if (!epgData || !epgData.events || !Array.isArray(epgData.events) || epgData.events.length === 0) {
                                return '<p style="color: #ff5252; padding: 10px;">Keine EPG-Daten empfangen. Bitte Bouquet-Einstellung prüfen.</p>';
                            }
                        
                            let html = `
                            <style>
                                .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; }
                                .e2-epg-table tr { border-bottom: 1px solid #444444; }
                                .e2-epg-table tr:nth-child(even) { background-color: rgba(255,255,255,0.5); }
                                .e2-epg-table td { padding: 10px 8px; vertical-align: top; }
                                .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; }
                                .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; }
                                .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; }
                                .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; }
                            </style>
                            <table class="e2-epg-table">
                            `;
                        
                            epgData.events.forEach(event => {
                                if (!event.sname || !event.title ) return;
                        
                                //const startTime = new Date(event.begin * 1000);
                                //const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                        
                                ////
                                // WICHTIG: Wert explizit in eine Ganzzahl konvertieren
                                const timestampInSeconds = parseInt(event.start, 10);
                                // Erst jetzt das Date-Objekt erzeugen
                                const startDateObj = new Date(timestampInSeconds * 1000);
                                // Formatieren der Ausgabe
                                const timeString = startDateObj.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                                const dateString = startDateObj.toLocaleDateString('de-DE');
                                ////
                                
                                html += `
                                <tr>
                                    <td class="e2-ch-name">${event.sname}</td>
                                    <td class="e2-time">${timeString} - ${dateString}</td>
                                    <td>
                                        <div class="e2-title">${event.title}</div>
                                        <div class="e2-desc">${event.description || ''}</div>
                                    </td>
                                </tr>
                                `;
                            });
                        
                            html += '</table>';
                            return html;
                        }
                        
                        async function updateEPG() {
                            try {
                                // 1. Automatisch die korrekte, vom OpenWebif akzeptierte ID ermitteln
                                const verifiedBref = await fetchValidBouquetRef();
                                
                                if (!verifiedBref) {
                                    log('Enigma2 EPG abgebrochen: Es konnte keine gültige Bouquet-Referenz von der Box gelesen werden.', 'error');
                                    return;
                                }
                        
                                // 2. Abfrage mit dem vom OpenWebif exakt geforderten Parameter 'bRef'
                                const url = `http://${BOX_IP}/api/epgnow?bRef=${encodeURIComponent(verifiedBref)}`;
                                const response = await axios.get(url, { timeout: 5000 });
                                
                                if (response && response.status === 200 && response.data) {
                                    const data = response.data;
                        
                                    if (data.result === false) {
                                        log(`Enigma2 meldet Fehler im Payload: ${data.message || 'Unbekannt'}`, 'warn');
                                        return;
                                    }
                        
                                    // 1. JSON speichern
                                    await setStateAsync(TARGET_JSON_DP, JSON.stringify(data), true);
                                    
                                    // 2. HTML generieren und speichern
                                    const htmlTable = buildHtmlTable(data);
                                    await setStateAsync(TARGET_HTML_DP, htmlTable, true);
                                    log('Enigma2 EPG erfolgreich aktualisiert.', 'info');
                                    
                                } else {
                                    const status = response ? response.status : 'Keine Antwort';
                                    log(`Enigma2 HTTP-Fehler: Status ${status}`, 'warn');
                                }
                            } catch (error) {
                                log(`Enigma2 EPG-Abruf fehlgeschlagen: ${error.message}`, 'warn');
                            }
                        }
                        
                        // Trigger: Alle 15 Minuten
                        schedule('*/15 * * * *', updateEPG);
                        
                        // Sofortstart beim Speichern
                        updateEPG();
                        

                        So richtig?

                        Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
                        Tapo C210 Cam
                        WLED Steuerung über lcdwiki

                        OliverIOO 1 Antwort Letzte Antwort
                        0
                        • matze55M matze55

                          Der gesamte Code so wie er jetzt aussieht:

                          // --- KONFIGURATION GIGABLUE ENIGMA2 BOX---
                          const BOX_IP = 'XXX.XXX.XXX.XX'; // IP deiner Enigma2 Box bitte anpassen
                          const TARGET_JSON_DP = '0_userdata.0.enigma2.epg_json'; //Datenpunkt Json
                          const TARGET_HTML_DP = '0_userdata.0.enigma2.epg_html'; //Datenpunkt Html
                          // ---------------------
                          
                          const axios = require('axios');
                          
                          // Datenpunkte erstellen, falls sie fehlen
                          await createStateAsync(TARGET_JSON_DP, { name: 'Enigma2 EPG JSON', type: 'string', role: 'json', read: true, write: false });
                          await createStateAsync(TARGET_HTML_DP, { name: 'Enigma2 EPG HTML für VIS', type: 'string', role: 'html', read: true, write: false });
                          
                          // Holt vollautomatisch die exakte ID des ersten TV-Bouquets
                          async function fetchValidBouquetRef() {
                              try {
                                  const response = await axios.get(`http://${BOX_IP}/api/getallservices`, { timeout: 3000 });
                                  
                                  if (response && response.data && response.data.services) {
                                      const services = response.data.services;
                                      
                                      // Fall 1: API liefert ein direktes Array
                                      if (Array.isArray(services) && services.length > 0) {
                                          return services[0].servicereference;
                                      } 
                                      // Fall 2: API liefert ein verschachteltes Objekt
                                      if (services.servicereference) {
                                          return services.servicereference;
                                      }
                                  }
                              } catch (e) {
                                  log(`Enigma2: Fehler beim automatischen Bouquet-Abruf: ${e.message}`, 'warn');
                              }
                              return null;
                          }
                          
                          function buildHtmlTable(epgData) {
                              if (!epgData || !epgData.events || !Array.isArray(epgData.events) || epgData.events.length === 0) {
                                  return '<p style="color: #ff5252; padding: 10px;">Keine EPG-Daten empfangen. Bitte Bouquet-Einstellung prüfen.</p>';
                              }
                          
                              let html = `
                              <style>
                                  .e2-epg-table { width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; color: #ffffff; }
                                  .e2-epg-table tr { border-bottom: 1px solid #444444; }
                                  .e2-epg-table tr:nth-child(even) { background-color: rgba(255,255,255,0.5); }
                                  .e2-epg-table td { padding: 10px 8px; vertical-align: top; }
                                  .e2-ch-name { font-weight: bold; color: #3498db; width: 33%; }
                                  .e2-time { color: #f1c40f; font-weight: bold; width: 33%; white-space: nowrap; }
                                  .e2-title { font-weight: bold; color: #ffffff; margin-bottom: 3px; }
                                  .e2-desc { color: #aaaaaa; font-size: 12px; line-height: 1.3; }
                              </style>
                              <table class="e2-epg-table">
                              `;
                          
                              epgData.events.forEach(event => {
                                  if (!event.sname || !event.title ) return;
                          
                                  //const startTime = new Date(event.begin * 1000);
                                  //const timeString = startTime.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                          
                                  ////
                                  // WICHTIG: Wert explizit in eine Ganzzahl konvertieren
                                  const timestampInSeconds = parseInt(event.start, 10);
                                  // Erst jetzt das Date-Objekt erzeugen
                                  const startDateObj = new Date(timestampInSeconds * 1000);
                                  // Formatieren der Ausgabe
                                  const timeString = startDateObj.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr';
                                  const dateString = startDateObj.toLocaleDateString('de-DE');
                                  ////
                                  
                                  html += `
                                  <tr>
                                      <td class="e2-ch-name">${event.sname}</td>
                                      <td class="e2-time">${timeString} - ${dateString}</td>
                                      <td>
                                          <div class="e2-title">${event.title}</div>
                                          <div class="e2-desc">${event.description || ''}</div>
                                      </td>
                                  </tr>
                                  `;
                              });
                          
                              html += '</table>';
                              return html;
                          }
                          
                          async function updateEPG() {
                              try {
                                  // 1. Automatisch die korrekte, vom OpenWebif akzeptierte ID ermitteln
                                  const verifiedBref = await fetchValidBouquetRef();
                                  
                                  if (!verifiedBref) {
                                      log('Enigma2 EPG abgebrochen: Es konnte keine gültige Bouquet-Referenz von der Box gelesen werden.', 'error');
                                      return;
                                  }
                          
                                  // 2. Abfrage mit dem vom OpenWebif exakt geforderten Parameter 'bRef'
                                  const url = `http://${BOX_IP}/api/epgnow?bRef=${encodeURIComponent(verifiedBref)}`;
                                  const response = await axios.get(url, { timeout: 5000 });
                                  
                                  if (response && response.status === 200 && response.data) {
                                      const data = response.data;
                          
                                      if (data.result === false) {
                                          log(`Enigma2 meldet Fehler im Payload: ${data.message || 'Unbekannt'}`, 'warn');
                                          return;
                                      }
                          
                                      // 1. JSON speichern
                                      await setStateAsync(TARGET_JSON_DP, JSON.stringify(data), true);
                                      
                                      // 2. HTML generieren und speichern
                                      const htmlTable = buildHtmlTable(data);
                                      await setStateAsync(TARGET_HTML_DP, htmlTable, true);
                                      log('Enigma2 EPG erfolgreich aktualisiert.', 'info');
                                      
                                  } else {
                                      const status = response ? response.status : 'Keine Antwort';
                                      log(`Enigma2 HTTP-Fehler: Status ${status}`, 'warn');
                                  }
                              } catch (error) {
                                  log(`Enigma2 EPG-Abruf fehlgeschlagen: ${error.message}`, 'warn');
                              }
                          }
                          
                          // Trigger: Alle 15 Minuten
                          schedule('*/15 * * * *', updateEPG);
                          
                          // Sofortstart beim Speichern
                          updateEPG();
                          

                          So richtig?

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb zuletzt editiert von OliverIO
                          #40

                          @matze55

                          Also, ich schau es mir jetzt nicht mehr an, ohne die Datengrundlage zu kennen

                          Sonst raten wir hier munter weiter

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          1 Antwort Letzte Antwort
                          0
                          • matze55M Offline
                            matze55M Offline
                            matze55
                            schrieb zuletzt editiert von
                            #41

                            Datengrundlage...habe ich gepostet. Aber ich nehme die Zeitangabe jetzt raus. sonst zeigt es ja an. Danke nochmal

                            Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
                            Tapo C210 Cam
                            WLED Steuerung über lcdwiki

                            1 Antwort Letzte Antwort
                            0

                            Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                            Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                            Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                            Registrieren Anmelden
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            453

                            Online

                            33.0k

                            Benutzer

                            83.5k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2026
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe