NEWS
[gelöst] LOGO! & Wochenschaltuhr
-
Gut, dann ist mir folgendes nicht klar:
on({id: "javascript.0.LOGO.Uhr1-1_Eind", change: "ne"}, function (dp){ var Zeittmp= getState("javascript.0.LOGO.Uhr1-1_Eind").val.toString(); if (getState ("javascript.0.LOGO.Uhr1-1_Eind").val < 1000) {Das wäre korrekt, wenn der Datenpunkt "javascript.0.LOGO.Uhr1-1_Eind" eine Zahl ("number") enthalten würde. Da er aber das Ergebnis von dec2hex() enthält, sollte es ein String sein. Ergänze mal durch ein Logging:
on({id: "javascript.0.LOGO.Uhr1-1_Eind", change: "ne"}, function (dp){ log(typeof dp.state.val); -
> javascript.0 2017-12-27 21:55:45.581 info script.js.common.WochenUhr.ZeitMitTrenzeichen: string
wie schon geschrieben: bin noch im Vorschulalter was JS betrifftAls Vorlage habe ich dem Skript von http://forum.iobroker.net/viewtopic.php?p=73365#p73365 genommen
/** * Beschreibe diese Funktion … */ createState('Sunrise', 0); createState('Sunrisenf', 0); on({id: "s7.1.DBs.DB1.Sunrise", change: "ne"}, function (obj) { (function(){ var ConvertBase = function (num) { return { from : function (baseFrom) { return { to : function (baseTo) { return parseInt(num, baseFrom).toString(baseTo); } }; } }; }; // decimal to hexadecimal ConvertBase.dec2hex = function (num) { return ConvertBase(num).from(10).to(16); }; this.ConvertBase = ConvertBase; })(this); setState("javascript.0.Sunrisenf",ConvertBase.dec2hex(getState("s7.1.DBs.DB1.Sunrise").val)); var Sunrisetmp= ConvertBase.dec2hex(getState("s7.1.DBs.DB1.Sunrise").val).toString(); //setState("javascript.0.Sunrise",Sunrisetmp.slice(0, 2) + String(":") + Sunrisetmp.slice(2, 4)) ; //bei 4 stelliger Zeit setState("javascript.0.Sunrise",Sunrisetmp.slice(0, 1) + String(":") + Sunrisetmp.slice(1, 3)) ; //bei 3 stelliger Zeit });dem habe ich http://forum.iobroker.net/viewtopic.php?p=106841#p106841
createState("LOGO.Uhr1-1_Ein", 0); createState("LOGO.Uhr1-1_Eintmp", 0); on({id: "s7.0.DBs.DB1.B023-a1", change: "ne"}, function (obj) { (function(){ var ConvertBase = function (num) { return { from : function (baseFrom) { return { to : function (baseTo) { return parseInt(num, baseFrom).toString(baseTo); } }; } }; }; // decimal to hexadecimal ConvertBase.dec2hex = function (num) { return ConvertBase(num).from(10).to(16) }; this.ConvertBase = ConvertBase; })(this); setState("javascript.0.LOGO.Uhr1-1_Eintmp",ConvertBase.dec2hex(getState("s7.0.DBs.DB1.B023-a1").val)); var Zeittmp= ConvertBase.dec2hex(getState("s7.0.DBs.DB1.B023-a1").val).toString(); if (getState ("javascript.0.LOGO.Uhr1-1_Eintmp").val < 1000) { setState("javascript.0.LOGO.Uhr1-1_Ein",Zeittmp.slice(0, 1) + String(":") + Zeittmp.slice(1, 3)) ; } else { setState("javascript.0.LOGO.Uhr1-1_Ein",Zeittmp.slice(0, 2) + String(":") + Zeittmp.slice(2, 4)) ; } });hex2dec habe ich auch von http://forum.iobroker.net/viewtopic.php?p=75107#p75107
createState('ZeitEinnf_in', 0); on({id: "javascript.0.ZeitEinnf_in"/*ZeitEinnf_in*/, change: "ne"}, function (obj) { (function(){ var ConvertBase = function (num) { return { from : function (baseFrom) { return { to : function (baseTo) { return parseInt(num, baseFrom).toString(baseTo); } }; } }; }; // hexadecimal to decimal ConvertBase.hex2dec = function (num) { return ConvertBase(num).from(16).to(10); }; this.ConvertBase = ConvertBase; })(this); setState("s7.1.DBs.DB1.ZeitEin",ConvertBase.hex2dec(getState("javascript.0.ZeitEinnf_in"/*ZeitEinnf_in*/).val)); });danach kamm die Geschichte ab Post1
-
Hier die beiden Funktionen:
function logotime2str(time) { var x = parseInt(time, 10).toString(16); if(parseInt(x) < 10) return '0:0' + x; if(parseInt(x) < 100) return '0:' + x; if(parseInt(x) < 1000) return x.slice(0, 1) + ':' + x.slice(1, 3); return x.slice(0, 2) + ':' + x.slice(2, 4); } function str2logotime(str) { // str im Format "hh:mm:ss" var x = str.split(':'); x = parseInt(x[0] + x[1], 16).toString(10); return parseInt(x); }EDIT: Habe das Skript noch für Zeiten < 0:10 Uhr und < 1:00 Uhr angepasst.
-
Der Aufruf der (globalen) Funktionen kann in einem einfachen Skript erfolgen.
const idLogo = 's7.0.DBs.DB1.B023-a1'; const idVis = 'javascript.0.LOGO.Uhr1-1_Ein'; on(idLogo, function(dp) { setStateDelayed(idVis, logotime2str(dp.state.val), 5000); }); on(idVis, function(dp) { setState(idLogo, str2logotime(dp.state.val)); }); -
so bald ich die beiden Funktionen in global hinterlege bekomme ich sofort einen Fehler `
Das kann ich bei mir nicht nachvollziehen. Es erfolgt lediglich ein Adapter-Restart mit einer Warnung. Der Restart ist erforderlich, da globale Skripte in alle anderen Skripte eingefügt werden müssen. -
Bei code7 hat sich der adapter verabschiedet (aber nicht ganz) die Instanz wurde mit einem neuen Prozess wieder gestartet, aber die alte existiert noch.
Entweder die prozesse killen oder den raspi neu starten
Gruß Rainer
-
Unter Skripte kann man einen neuen Ordner und eine neue Gruppe erstellen. Wo ist der Unterschied? `
Ich kenne nur die Möglichkeiten eine neue Gruppe oder ein neues Skript (innerhalb einer Gruppe) zu erstellen. Wo findest Du "neuen Ordner erstellen" ? -
Hallo Vumer,
genau diese Funktion habe ich auch gesucht!! Bin ja auch mit der LOGO 8 unterwegs.
Allerdings kriege ich die beiden Scripts nicht zum laufen. Habe die beiden Funktionen (logotime2str und str2logotime) als separate Globale Scripte angelegt. Dann das Script zum Aufrufen der beiden Funktionen als Common-Script angelegt. Die beiden Variablen darin habe ich für meine Bedürfnisse angepasst. Hier habe ich schon die erste Frage: –> die Konstante idLogo ist soweit klar aber die folgende const idVis muss die "von Hand" angelegt werden?
Die Scripte laufen scheinbar ohne Fehler (Objektansicht ioBroker zeigt beim Common.Script true, bei den beiden Globalen Scripten jedoch false) aber es wird keine Variable erzeugt bzw. diese hat den Wert "null".
Steff
-
Hallo Steff,
Hast du auch einen Datenpunkt angelegt?
So habe ich das gemacht
Unter global habe ich mit dem name Converter
function logotime2str(time) { var x = parseInt(time, 10).toString(16); if(parseInt(x) < 10) return '0:0' + x; if(parseInt(x) < 100) return '0:' + x; if(parseInt(x) < 1000) return x.slice(0, 1) + ':' + x.slice(1, 3); return x.slice(0, 2) + ':' + x.slice(2, 4); } function str2logotime(str) { // str im Format "hh:mm:ss" var x = str.split(':'); x = parseInt(x[0] + x[1], 16).toString(10); return parseInt(x); } ````angelegt. Unter common habe ich eine neue Gruppe mit dem Name LOGO erstellt Unter die Gruppe LOGO einen Skrip für die erste Uhr mit dem Name Uhr1-1_EincreateState("LOGO.Uhr1-1_Ein", 0);
const idLogo = 's7.0.DBs.DB1.B023-a1';
const idVis = 'javascript.0.LOGO.Uhr1-1_Ein';on(idLogo, function(dp) {
setStateDelayed(idVis, logotime2str(dp.state.val), 5000);
});on(idVis, function(dp) {
setState(idLogo, str2logotime(dp.state.val));
});Unter dem Name Uhr1-1_AuscreateState("LOGO.Uhr1-1_Aus", 0);
const idLogo = 's7.0.DBs.DB1.B023-b1';
const idVis = 'javascript.0.LOGO.Uhr1-1_Aus';on(idLogo, function(dp) {
setStateDelayed(idVis, logotime2str(dp.state.val), 5000);
});on(idVis, function(dp) {
setState(idLogo, str2logotime(dp.state.val));
});und so weiter, erstellt Schöne Grüße -
Falsches Gedanke
Der Script macht nur was wenn sich der Wert verendert, damit er nicht immer leuft. z.B wenn du in der LOGO die Zeit verenderst dann aktualisiert der Skript das. Oder du nimms im vis dem Widget "Jqui ctrl Input Datetime" umd stellst die Uhr im vis ein
2071_zwischenablage01.jpg