Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • 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. JavaScript
  5. benötige Hilfe bei enigma2 Adapter Erweiterung

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    900

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

benötige Hilfe bei enigma2 Adapter Erweiterung

Geplant Angeheftet Gesperrt Verschoben JavaScript
7 Beiträge 3 Kommentatoren 576 Aufrufe 1 Watching
  • Ä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.
  • Matten MattenM Offline
    Matten MattenM Offline
    Matten Matten
    schrieb am zuletzt editiert von Matten Matten
    #1

    Hallo ich würde gerne den enigma2 Adapter erweitern, in dem ich die Timerabfrage einbauen möchte. Der code sieht wie folgt aus:

    function TimerSearch (command, deviceId, xml) {
    	//var bool;
        switch (command.toUpperCase())
        {
            case "TIMERLIST":
                // Clear Timerlist
                adapter.delObject('Timer');
    			if(xml.e2timerlist.e2timer !== undefined)
    			{
    				for (var i = 0; i < xml.e2timerlist.e2timer.length; i++)
    				{
    					adapter.setObjectNotExists('Timer.' + i + '.Event_Name', {
    						type: 'state',
    						common: {
    							type: 'string',
    							role: 'state',
    							name: 'Sendung Name',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Station', {
    						type: 'state',
    						common: {
    							type: 'string',
    							role: 'state',
    							name: 'TV Sender',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Disabled', {
    						type: 'state',
    						common: {
    							type: 'number',
    							role: 'state',
    							states: {
    								0: 'Timer aktiviert',
    								1: 'Timer deaktiviert'
    							},
    							name: 'Timer Aktivität',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Repeated', {
    						type: 'state',
    						common: {
    							type: 'number',
    							role: 'state',
    							name: 'Timer Wiederholung',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Timer_Start', {
    						type: 'state',
    						common: {
    							type: 'number',
    							role: 'state',
    							name: 'Timer Aktivität',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Timer_End', {
    						type: 'state',
    						common: {
    							type: 'number',
    							role: 'state',
    							name: 'Timer Aktivität',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    
    					adapter.setObjectNotExists('Timer.' + i + '.Timer_servicereference', {
    						type: 'state',
    						common: {
    							type: 'number',
    							role: 'state',
    							name: 'Timer Aktivität',
    							read:  true,
    							write: false
    						},
    						native: {}
    					});
    					//++BUTTON++ 	Timer_Toggle
    					adapter.setObjectNotExists('Timer.' + i + '.Delete', {
    						type: 'state',
    						common: {
    							type: 'boolean',
    							role: 'button',
    							name: 'Timer Delete',
    							read:  false,
    							write: true
    						},
    						native: {}
    					});
    					adapter.setObjectNotExists('Timer.' + i + '.Timer_Toggle', {
    						type: 'state',
    						common: {
    							type: 'boolean',
    							role: 'button',
    							name: 'Timer ON/OFF',
    							read:  false,
    							write: true
    						},
    						native: {}
    					});
    					
    					adapter.setState('Timer.' + i + '.Event_Name', {val: xml.e2timerlist.e2timer[i].e2name[0], ack: true});
    					adapter.setState('Timer.' + i + '.Station', {val: xml.e2timerlist.e2timer[i].e2servicename[0], ack: true});
    					adapter.setState('Timer.' + i + '.Disabled', {val: xml.e2timerlist.e2timer[i].e2disabled[0], ack: true});
    					adapter.setState('Timer.' + i + '.Repeated', {val: xml.e2timerlist.e2timer[i].e2repeated[0], ack: true});
    					adapter.setState('Timer.' + i + '.Timer_servicereference', {val: xml.e2timerlist.e2timer[i].e2servicereference[0], ack: true});
    					adapter.setState('Timer.' + i + '.Timer_End', {val: DateTime(xml.e2timerlist.e2timer[i].e2timeend[0]), ack: true});
    					adapter.setState('Timer.' + i + '.Timer_Start', {val: DateTime(xml.e2timerlist.e2timer[i].e2timebegin[0]), ack: true});
    					
    				}
    			}
    			break;
    
            default:
                adapter.log.info("received unknown TimerSearch '"+command+"' @ TimerSearch");
        }
    }
    
    function DateTime(eventtime) {
    	
    	var date = new Date(eventtime * 1000);
    	// Hours part from the timestamp
    	var hours = date.getHours();
    	// Minutes part from the timestamp
    	var minutes = "0" + date.getMinutes();
    
    	// Will display time in 10:30 format
    	return hours + ':' + minutes.substr(-2);
    }
    

    Das auslesen der xml und erstellen der Objekte funktioniert soweit, jetzt würde ich gerne auf das auslösen der Objekt-button: 'Timer.' + i + '.Delete' und 'Timer.' + i + '.Timer_Toggle' reagieren

    nun bin ich aber mit meinem Latein am Ende was java Programierung an geht, da die obigen Objekte ja jeh nach dem wie viele Timer Ermittelt wurden unterschiedlich viele sind.

    adapter.on('stateChange', function (id, state) {
    	if (id && state && !state.ack) {
            var parts = id.split('.');
            var name = parts.pop();
    
            if (id === adapter.namespace + '.Timer.0.Timer_Toggle') {
                adapter.getState('Timer.' + i + '.Timer_servicereference', function(err, state) {
                    var T_sRef  = state.val;
                    adapter.getState('Timer.' + i + '.Timer_Start', function(err, state) {
                        var T_begin  = state.val;
                        adapter.getState('Timer.' + i + '.Timer_End', function(err, state) {
                            var T_end  = state.val;
                            getResponse('NONE', deviceId, PATH['TIMER_TOGGLE'] + T_sRef + '&begin=' + T_begin + '&end=' + T_end, function (error, command, deviceId, xml) {
                                if (!error) {
                                    adapter.setState('Timer.' + i + '.Timer_Toggle', state.val, true);
                                } else {
                                    getResponse('TIMERLIST', deviceId, PATH['TIMERLIST'], TimerSearch);
                                }
                            });
                        });
                    });
                });
    		} else if (id === adapter.namespace + '.Timer.0.Delete') {
    			adapter.getState('Timer.' + i + '.Timer_servicereference', function(err, state) {
                    var T_sRef  = state.val;
                    adapter.getState('Timer.' + i + '.Timer_Start', function(err, state) {
                        var T_begin  = state.val;
                        adapter.getState('Timer.' + i + '.Timer_End', function(err, state) {
                            var T_end  = state.val;
                            getResponse('NONE', deviceId, PATH['DELETE'] + T_sRef + '&begin=' + T_begin + '&end=' + T_end, function (error, command, deviceId, xml) {
                                if (!error) {
                                    adapter.setState('Timer.' + i + '.Delete', state.val, true);
                                } else {
                                    adapter.setState('Timer.' + i + '.Delete', {val: state.val, ack: true});
                                    getResponse('TIMERLIST', deviceId, PATH['TIMERLIST'], TimerSearch);
                                }
                            });
                        });
                    });
                });
            };
        }	
    });
    

    Ich hab jetzt das problem das ich nicht weiß wie ich statt :

    adapter.namespace + '.Timer.0.Timer_Toggle'
    
    //und
    
    adapter.namespace + '.Timer.0.Delete'
    

    es ändern kann um das genau so dynamisch zu halten

    Ich hoffe ich hab mich verständlich ausgedrückt?

    Gruß
    Matten Matten

    ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

    1 Antwort Letzte Antwort
    0
    • Matten MattenM Offline
      Matten MattenM Offline
      Matten Matten
      schrieb am zuletzt editiert von
      #2

      die erstellten Objekte sehen dann z.b. so aus:
      timer.png

      ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

      1 Antwort Letzte Antwort
      0
      • Matten MattenM Offline
        Matten MattenM Offline
        Matten Matten
        schrieb am zuletzt editiert von
        #3

        ach ja und das einfache

        adapter.delObject('Timer');
        

        löscht leider nicht den Objektordner sammt der Timer :man-shrugging:

        ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

        ScroungerS 2 Antworten Letzte Antwort
        0
        • Matten MattenM Matten Matten

          ach ja und das einfache

          adapter.delObject('Timer');
          

          löscht leider nicht den Objektordner sammt der Timer :man-shrugging:

          ScroungerS Offline
          ScroungerS Offline
          Scrounger
          Developer
          schrieb am zuletzt editiert von
          #4

          @Matten-Matten
          Du kannst mit 'getStates("enigma2.0.Timer.*")' bzw. 'getObjects' alle Datenpunkte bekommen. Die musst dann in ner Schleife durchlaufen und die ID zum Löschen der einzelnen Datenpunkte verwenden.

          1 Antwort Letzte Antwort
          0
          • DutchmanD Offline
            DutchmanD Offline
            Dutchman
            Developer Most Active Administrators
            schrieb am zuletzt editiert von
            #5

            ich müsste die anstehende Struktur bzw Datenpunkte mal sehen.
            theoretisch reagierst du ja immer auf ein event das in iobroker der wert geandert wird, das macht man mit nem subscriptie state (zb * fuer all oder nur die du erstellt hast).

            Ergo der on event gibt dir den state, eventuell musst du nur die "." splitten und dan den letzten nemen fuer deinen wert ?

            1 Antwort Letzte Antwort
            0
            • Matten MattenM Matten Matten

              ach ja und das einfache

              adapter.delObject('Timer');
              

              löscht leider nicht den Objektordner sammt der Timer :man-shrugging:

              ScroungerS Offline
              ScroungerS Offline
              Scrounger
              Developer
              schrieb am zuletzt editiert von
              #6

              @Matten-Matten
              Ich hab nochmal über die Struktur der Timer Datenpunkte nachgedacht.
              Ich würde die nicht dynamisch erzeugen und löschen.

              Nehmen wir folgendes Beispiel. Die Box hat aktuell 5 Timer, d.h. es existieren x.Timer.0.x -> x.Timer.5.x. Wenn jetzt eine Aufnahme erfolgt ist würdest du z.B. x.Timer.5.x löschen. Wenn aber jetzt jmd z.B. im Vis oder Skripten den Timer x.Timer.5.x verwendet bekommt der ein Problem.

              Denke es wäre besser du machst z.B. 10 fixe Timer.x Datenpunkte, die dann aufsteigend nach RecordTime befüllt werden. Wenn dann ab Timer.5.x keine mehr existieren, dann lösch nur die Daten in den Datenpunkten. Zusätzlich würde ich noch ein Boolean einführen - timerExist - den du dann in diesem Fall auf 'false' setzen würdest.

              Matten MattenM 1 Antwort Letzte Antwort
              0
              • ScroungerS Scrounger

                @Matten-Matten
                Ich hab nochmal über die Struktur der Timer Datenpunkte nachgedacht.
                Ich würde die nicht dynamisch erzeugen und löschen.

                Nehmen wir folgendes Beispiel. Die Box hat aktuell 5 Timer, d.h. es existieren x.Timer.0.x -> x.Timer.5.x. Wenn jetzt eine Aufnahme erfolgt ist würdest du z.B. x.Timer.5.x löschen. Wenn aber jetzt jmd z.B. im Vis oder Skripten den Timer x.Timer.5.x verwendet bekommt der ein Problem.

                Denke es wäre besser du machst z.B. 10 fixe Timer.x Datenpunkte, die dann aufsteigend nach RecordTime befüllt werden. Wenn dann ab Timer.5.x keine mehr existieren, dann lösch nur die Daten in den Datenpunkten. Zusätzlich würde ich noch ein Boolean einführen - timerExist - den du dann in diesem Fall auf 'false' setzen würdest.

                Matten MattenM Offline
                Matten MattenM Offline
                Matten Matten
                schrieb am zuletzt editiert von
                #7

                @Scrounger
                Die fixe Timerprogrammierung hatte ich schon Mal mit 6 oder sogar 10 timern. Ich denke aber auch das du Recht hast die Timer Datenpunkte fest anzulegen.

                ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

                1 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                612

                Online

                32.6k

                Benutzer

                82.2k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                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