Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Viessmann-Adapter

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Viessmann-Adapter

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 last edited by

      Ich habe wohl slice() falsch angewendet. Korrigiere bitte:

      cmds = cmds.slice(1, cmds.length);  // erstes Komma raus
      

      oder besser:

      cmds = cmds.substr(1);  // erstes Komma raus
      
      1 Reply Last reply Reply Quote 0
      • D
        dtp last edited by

        Hallo Paul,

        damit ist die Fehlermeldung zwar verschwunden, allerdings steht in cmds immer nur der letzte Parameter drin. Also im vorliegenden Fall "getVitoTempKesselIst".

        Hatte es mit

        `cmds[i] = ',getVito' + list[i];`
        
        versucht, aber das klappt leider nicht.
        
        Gruß,
        
        Thorsten[/i][/i]
        
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 last edited by

          @dtp:

          …allerdings steht in cmds immer nur der letzte Parameter drin. `
          Sorry, mein Fehler. In der for-Schleife muss es richtig lauten:

           `cmds = cmds + ',getVito' + list[i];`
          Das hatte ich auch vor und deshalb _~~[i]~~cmds[/i]_ mit einem Leerstring initialisiert. Habe dann wohl zu schnell getippt  ;)[/i]
          
          1 Reply Last reply Reply Quote 0
          • D
            dtp last edited by

            Hi paul53,

            exakt. Hatte es gerade eben selbst rausgefunden. Nachdem ich gestern weiter oben ja noch geschrieben hatte, dass Javascript und das HomeMatic-Scripting durchaus Parallelen haben, ist es mir dann vorhin wie Schuppen von den Haaren gefallen. 😉

            Auf jeden Fall danke für Deinen Support. Nun funzt das Skript.

            Gruß,

            Thorsten

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              @dtp:

              Nun funzt das Skript. `
              Das freut mich zu lesen 😄
              @dtp:

              Allerdings fände ich es sehr hilfreich, wenn ich … meine Heizungsanlage in den Heizung- und Warmwasser-, Nur-Warmwasser-, Abschalt-, Spar- oder Ferienbetrieb versetzen könnte. `
              Das sollte funktionieren, wenn Du das Script um das Setzen der Betriebsart ergänzt:

              createState('Vitotronic.Betriebsart', 0, {
                  type: 'number',
                  read: true,
                  write: true,
                  desc: 'Vitotronic Betriebsart setzen',
                  min: 0, 
                  max: 4, 
                  def: 0, 
                  states: '0:Aus;1:WW;2:WW+Hzg;3:Reduziert;4:Normal'
              });
              
              on("javascript." + instance + ".Vitotronic.Betriebsart", function(dp) {
              	exec('vclient -h 127.0.0.1:3002 -c setVitoBetriebsart ' + dp.state.val, function(err, stdout, stderr) {
              		if (err) log(stderr,'error');
              	});
              });
              
              
              1 Reply Last reply Reply Quote 0
              • S
                Solear last edited by

                Es macht Spaß, auch beim zaubern zuzusehen 🙂

                @dtp

                Könntest du am Ende bitte das ganze Skript bereitstellen, damit sich nicht jeder durchwühlen muss?

                Gerne im Beitrag 1 mit einfügen. :geek:

                1 Reply Last reply Reply Quote 0
                • D
                  dtp last edited by

                  Hallo,

                  die Nacht hat das Skript gut überstanden. 😉 Eigentlich sind's zwei Skripte, da ich ca. 40 bis 50 Parameter auslese und ich feststellen musste, dass dann irgendwann Feierabend war. Hab's daher einfach zweigeteilt. Vermutlich ist sogar noch ein drittes Skript erforderlich, weil die ausgegebenen Timer-Werte für die Zeitsteuerung der Heizung und des Warmwassers jeweils aus vier Zeilen bestehen, die im aktuellen Skript noch nicht korrekt ausgelesen werden. Daher habe ich die erst mal raus genommen. Da macht die Zeile

                  stdout = stdout.split("\n");
                  

                  noch Schwierigkeiten.

                  @paul53:

                  Danke für Dein "Set"-Skript. Werde ich mal ausprobieren.

                  @Solear:

                  Wird gemacht. Allerdings werde ich da wohl besser einen neuen Thread im "Skripte"-Unterforum aufmachen, weil es hier ja eigentlich um den Adapter ging. Da hoffe ich auch noch so ein wenig auf die Unterstützung von @Eisbaeeer, auch wenn dank @paul53 schon mal ein gut funktionierender Workaround gefunden wurde.

                  Der Adapter soll ein paar Dinge universeller gestalten, wie z.B. das automatische Auslesen der getaddr- und setaddr-Parameter und die einfache Möglichkeit, individuelle Polling-Zeiten für jeden Parameter setzen zu können.

                  Gruß,

                  Thorsten

                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @dtp:

                    Eigentlich sind's zwei Skripte, da ich ca. 40 bis 50 Parameter auslese und ich feststellen musste, dass dann irgendwann Feierabend war. Hab's daher einfach zweigeteilt. `
                    Das lässt sich auch in einem Skript (mit 2 Listen) machen, wobei man dann gleich in eine Liste für schnelle Abfrage (z.B. Kessel-, Vorlauftemperaturen) und für langsame Abfrage (z.B. Aussen-, Warmwassertemperatur) unterscheiden sollte.

                    `// Werte aus Vitotronic auslesen
                    
                    var list1 = ['TempKesselIst',...];  // schnell veränderliche Werte
                    var list2 = ['TempAussen','TempWWIst','TempKesselSoll',...];  // träge Werte
                    var list3 = ['TimerSoWW',...];  // Timer
                    
                    function init(list) {
                       var len = list.length;
                       var cmds = '';
                       for(var i = 0; i < len; i++) {
                          cmds = cmds + ',getVito' + list[i];
                          createState('Vitotronic.' + list[i], '', {
                             type: 'string',
                             read: true,
                             write: true,
                             desc: 'Vitotronic ' + list[i],
                             def: ''
                          });
                       }
                       return cmds.substr(1); // erstes Komma raus
                    }
                    
                    // Script start
                    var cmds1 = init(list1);
                    var cmds2 = init(list2);
                    var cmds3 = init(list3);
                    
                    function vito(cmds, list, timer) {
                       exec('vclient -h 127.0.0.1:3002 -c ' + cmds, function(err, stdout, stderr) {
                          if (err) {
                             log(stderr,'error');
                             return;
                          }
                          stdout = stdout.split("\n");
                          var len = list.length;
                          for(var i = 0; i < len; i++) {
                             if(timer) setState("Vitotronic." + list[i], stdout[5*i+1]+" "+stdout[5*i+2]+" "+stdout[5*i+3]+" "+stdout[5*i+4]);
                             else setState("javascript."+ instance + ".Vitotronic." + list[i], stdout[2 * i + 1]);
                          }
                       });
                    }
                    
                    setInterval(function() {
                       vito(cmds1, list1, false);
                    }, 20 * 1000); // alle 20 Sekunden
                    
                    setInterval(function() {
                       vito(cmds2, list2, false);
                    }, 300 * 1000); // alle 5 Minuten
                    
                    setInterval(function() {
                       vito(cmds3, list3, true);
                    }, 300 * 1000); // alle 5 Minuten` [/i][/i][/i][/i][/i]
                    
                    1 Reply Last reply Reply Quote 0
                    • D
                      dtp last edited by

                      Danke. Werde ich mal testen.

                      Du hast nicht zufällig noch ne Idee bzgl. der mehrzeiligen Timer-Ausgaben? Es sind immer vier Zeilen.

                      Gruß,

                      Thorsten

                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        @dtp:

                        Du hast nicht zufällig noch ne Idee bzgl. der mehrzeiligen Timer-Ausgaben? Es sind immer vier Zeilen. `
                        Was ist der Inhalt der 4 Zeilen ? Welche Kommandos gehören dazu ?

                        Da wird man nach Kommandos in der Auswertung selektieren müssen. Oder man macht eine 3. Liste (nur Timer-Kommandos) und wertet dann in einer abgewandelten Funktion anders aus als für den Rest.

                        1 Reply Last reply Reply Quote 0
                        • D
                          dtp last edited by

                          Hallo paul53,

                          die Ausgabe sieht z.B. so aus:

                          vctrld>getVitoTimerSoWW

                          1:An:06:30 Aus:09:00

                          2:An:12:00 Aus:14:00

                          3:An:17:00 Aus:20:00

                          4:An:– Aus:--

                          Ist bei allen Timer-Einstellungen derselbe Aufbau.

                          Gruß,

                          Thorsten

                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 last edited by

                            Möchtest Du die 4 Zeitspannen in einem Datenpunkt darstellen oder in 4 DP ?

                            1 Reply Last reply Reply Quote 0
                            • D
                              dtp last edited by

                              Nee, in einem.

                              1 Reply Last reply Reply Quote 0
                              • D
                                dtp last edited by

                                @paul53:

                                Das lässt sich auch in einem Skript (mit 2 Listen) machen… `

                                Läuft super. Danke.

                                1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 last edited by

                                  @dtp:

                                  Nee, in einem. `
                                  Unter der Voraussetzung, dass alle Timer-Kommandos in der Liste mit "Timer" beginnen, sollte eine Erweiterung der setState-Schleife genügen:

                                   `for(var i = 0; i < len; i++) {
                                           if(list[i].substr(0,5) == "Timer") {
                                           setState("Vitotronic." + list[i], stdout[2*i+1]+" "+stdout[2*i+2]+" "+stdout[2*i+3]+" "+stdout[2*i+4]);
                                           }
                                           else setState("Vitotronic." + list[i], stdout[2 * i + 1]);
                                        }`
                                  
                                  EDIT: Das funktioniert so einfach leider nicht, da bei den Timern der Abstand von 2 Elementen im Array nicht zutrifft. Also besser mit 3\. Liste: Habe das Skript oben entsprechend abgewandelt.[/i][/i][/i]
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 last edited by

                                    Siehe http://forum.iobroker.net/viewtopic.php?f=23&t=3048&start=40#p29920 (3. Liste).

                                    1 Reply Last reply Reply Quote 0
                                    • D
                                      dtp last edited by

                                      Danke, werde es ausprobieren. Wirklich tollen Support, den Du hier leistest. Nochmals großen Dank dafür.

                                      Gruß,

                                      Thorsten

                                      1 Reply Last reply Reply Quote 0
                                      • D
                                        dtp last edited by

                                        Hallo paul53,

                                        bin gerade am Ausprobieren Deiner Timer-Zeilen. Allerdings verstehe ich da was nicht so ganz. Warum

                                        `if(timer) setState("Vitotronic." + list[i], stdout[5*i+1]+" "+stdout[5*i+2]+" "+stdout[5*i+3]+" "+stdout[5*i+4]);` 
                                        
                                        und nicht
                                        
                                        `~~[code]~~if(timer) setState("javascript."+ instance + ".Vitotronic." + list[i], stdout[5*i+1]+" "+stdout[5*i+2]+" "+stdout[5*i+3]+" "+stdout[5*i+4]);` 
                                        
                                        EDIT: Nun scheint's zu passen.
                                        
                                        >! ~~[spoiler]~~`~~[code]~~// Werte aus Vitotronic auslesen
                                        >! var list1 = ['Betriebsart','BetriebsartHK','BetriebParty','BetriebSpar','TempAussen','TempWWIst','TempSpeicher','TempWWAuslauf','TempKesselIst','TempRLIst','TempRaumHK','TempSolarkol','TempSolarspeicher','StatusPumpeSpeicher','StatusFlamme','StatusPumpeIntern','DrehzahlPumpeIntern','StatusPumpeHK','StatusPumpeZirku','StatusUmschaltventil','Systemzeit'];
                                        var list2 = ['BetriebFerien','BeginnFerien','EndeFerien','TempRaumNorSoll','TempRaumRedSoll','TempPartySoll','TempWWSoll','TempKesselSoll','TempVLSoll','KennlinieNeigung','KennlinieNiveau','LaufzeitBrenner','StartsBrenner','LaufzeitSolar','LeistungSolar','ErtragTagSolar','Systemzeit'];
                                        var list3 = ['StatusStoerung','Stoerung1','Stoerung2','Stoerung3','Stoerung4','Stoerung5','Stoerung6','Stoerung7','Stoerung8','Stoerung9','Stoerung10','Anlagenschema','Systemzeit'];
                                        var list4 = ['TimerMoHeizen','TimerDiHeizen','TimerMiHeizen','TimerDoHeizen','TimerFrHeizen','TimerSaHeizen','TimerSoHeizen','TimerMoWW','TimerDiWW','TimerMiWW','TimerDoWW','TimerFrWW','TimerSaWW','TimerSoWW','TimerMoPumpeZirku','TimerDiPumpeZirku','TimerMiPumpeZirku','TimerDoPumpeZirku','TimerFrPumpeZirku','TimerSaPumpeZirku','TimerSoPumpeZirku'];
                                        >! // Objekte setzen
                                        function init(list) {
                                           var len = list.length;
                                           var cmds = '';
                                           for(var i = 0; i < len; i++) {
                                              cmds = cmds + ',getVito' + list[i];
                                              createState('Vitotronic.' + list[i], '', {
                                                 type: 'string',
                                                 read: true,
                                                 write: true,
                                                 desc: 'Vitotronic ' + list[i],
                                                 def: ''
                                              });
                                           }
                                           return cmds.substr(1); // erstes Komma löschen
                                        }
                                        >! // Skript starten
                                        var cmds1 = init(list1);
                                        var cmds2 = init(list2);
                                        var cmds3 = init(list3);
                                        var cmds4 = init(list4);
                                        >! function vito(cmds, list, timer) {
                                           exec('vclient -h 127.0.0.1:3002 -c ' + cmds, function(err, stdout, stderr) {
                                              if (err) {
                                                 log(stderr,'error');
                                                 return;
                                              }
                                              stdout = stdout.split("\n");
                                              var len = list.length;
                                              for(var i = 0; i < len; i++) {
                                                 if(timer) setState("javascript."+ instance + ".Vitotronic." + list[i], stdout[5 * i + 1]+" "+stdout[ 5 * i + 2]+" "+stdout[ 5 * i + 3]+" "+stdout[5 * i + 4]);
                                                 else setState("javascript."+ instance + ".Vitotronic." + list[i], stdout[2 * i + 1]);
                                              }
                                           });
                                        }
                                        >! // Zeitintervalle definieren
                                        setInterval(function() {
                                           vito(cmds1, list1, false);
                                        }, 120 * 1000); // alle 2 Minuten
                                        
                                        setInterval(function() {
                                           vito(cmds2, list2, false);
                                        }, 1800 * 1000); // alle 30 Minuten
                                        >! setInterval(function() {
                                           vito(cmds3, list3, false);
                                        }, 3600 * 1000); // alle 60 Minuten
                                        >! setInterval(function() {
                                           vito(cmds4, list4, true);
                                        }, 7200 * 1000); // alle 120 Minuten` 
                                        
                                        Gruß,
                                        
                                        Thorsten[/i][/i][/i][/i][/i][/code][/spoiler][/i][/code][/i]
                                        
                                        1 Reply Last reply Reply Quote 0
                                        • paul53
                                          paul53 last edited by

                                          @dtp:

                                          Allerdings verstehe ich da was nicht so ganz. `
                                          Wenn man mit setState() oder getState() einen Datenpunkt innerhalb der JS-Instanz des Skriptes adressiert, muss nicht die gesamte ID angegeben werden, sondern es genügt der Teil, mit dem der Datenpunkt per createState() erzeugt wurde.

                                          1 Reply Last reply Reply Quote 0
                                          • D
                                            dtp last edited by

                                            Ah. Danke für die Aufklärung.

                                            Gruß,

                                            Thorsten

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            697
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            viesmann
                                            50
                                            523
                                            122076
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo