NEWS
Viessmann-Adapter
-
@dtp:Ich bin mir da leider nicht so ganz sicher, aber glaube, dass der CCU.IO-Adapter nicht den vclient verwendet, `
Ja, das ist richtig. -
@dtp:Da schieint mir die geschlossene Klammer hinter "list__" zu viel.__ __Stimmt.
Das Array "list" muss mit strings gefüllt werden:_
var list = ['TempAussen','TempWWIst','TempKesselSoll','TempKesselIst']; ````_ `
-
Jetzt bekomme ich leider einen Segmentierungsfehler angezeigt:
javascript.0 script.js.common.Vitotronic: Segmentation fault
Ne Idee?
Die Datenpunkte werden aber schon mal korrekt angelegt.
filename="2016-07-02_14h22_10.png" index="0">~~
-
@dtp:Ne Idee? `
Leider nichtFüge mal ein Log ein:
cmds = cmds.slice(0, 1); // erstes Komma raus log(cmds);
-
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
-
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]
-
@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]
-
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
-
@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'); }); });
-
Es macht Spaß, auch beim zaubern zuzusehen
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:
-
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.
Danke für Dein "Set"-Skript. Werde ich mal ausprobieren.
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
-
@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]
-
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
-
@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.
-
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
-
Möchtest Du die 4 Zeitspannen in einem Datenpunkt darstellen oder in 4 DP ?
-
Nee, in einem.
-
-
@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]
-
Siehe http://forum.iobroker.net/viewtopic.php?f=23&t=3048&start=40#p29920 (3. Liste).