Seite 1 von 1

Skript MQTT Wochenprogramm

Verfasst: Sa 4. Apr 2020, 07:45
von Blubbel
Hallo Ihr,

hier mein Skript, um das Wochebprogramm , im MQTT Adapter dargestellt als HEX Wert, als Wochenprogramm anzeigen zu lassen. Den Datenpunkt hab ich im Vorfeld schon angelegt. Nochwas, ich bin kein SW Entwickler und hab nach bestem Wissen das Skript zusammengestoppelt ;)

Code: Alles auswählen

on({id: 'mqtt.0.Robonect.mower.timer.ch0.weekdays', change: "ne"}, function (obj) {
var obj= 'mqtt.0.Robonect.mower.timer.ch0.weekdays'/*Robonect/mower/timer/ch0/weekdays*/
var  myNum = getState(obj).val;
var myHex = myNum.toString(16);
var myNum = parseInt(myHex, 16);
var myBin = myNum.toString(2);
var Length = myBin.length;

var VorneDran = "0"
var VorneDran = 8 - Length

for(i=0; i<VorneDran; i++)
 {
 myBin = "0" + myBin
 } 
var Woche = "";
var Montag = myBin.slice(7,8);
var Dienstag = myBin.slice(6,7);
var Mittwoch = myBin.slice(5,6);
var Donnerstag = myBin.slice(4,5);
var Freitag = myBin.slice(3,4);
var Samstag = myBin.slice(2,3);
var Sonntag = myBin.slice(1,2);

if(Montag == 1) {Woche = "Mo "}
if(Dienstag == "1") {Woche = Woche + "Di "}
if(Mittwoch == "1") {Woche = Woche + "Mi "}
if(Donnerstag == "1") {Woche = Woche + "Do "}
if(Freitag == "1") {Woche = Woche + "Fr "}
if(Samstag == "1") {Woche = Woche + "Sa "}
if(Sonntag == "1") {Woche = Woche + "So "}

setState('javascript.0.Robonect.WochenTimer', Woche); 
});

Re: Skript MQTT Wochenprogramm

Verfasst: Sa 4. Apr 2020, 14:20
von Blubbel
Da hier im Forum seltenst genau beschrieben wurde, was und warum es wie gemacht wurde hier mal eine Beschreibung, die auch SuperAnfängern die Logik dahinter erklärt, dass da keine große Magie dahinter steckt:

Zur Erklärung was ich gemacht habe:
1.) DIe Daten für das Wochenprogramm liegen in HEX vor. Somit lag der Verdacht nahe, dass die Wochentage als Bits gesetzt werden, so war es dann auch, leider anders als gedacht, dazu später.
Leider kann JS nicht drekt von HEX nach BIN sondern üner Strings nach DEC und dann weiter nach BIN.

Das passiert hier:

Code: Alles auswählen

var  myNum = getState(obj).val;
var myHex = myNum.toString(16);
var myNum = parseInt(myHex, 16);
var myBin = myNum.toString(2);
var Length = myBin.length;
Wenn alle Tage gesetzt sind, schaut der Output so aus:

0 1 1 1 1 1 1 1 1 -> 0 (ist für nix, es sind ja nur 7 Wochentage) also 0 So Sa Fr Do Mi Di Mo
Problem: Setzt man Montag und Dienstag schaut das BIN so aus: 1 1 :(
Deshalb hab ich eine Schleife gebaut, die immer 8 Bits generiert. Welche Length kommt raus? Vornedran kommt immer eine "0". Wie viele "0" muss ich vornedran hängen, dass wieder 8 Bits rauskommen?Per Schleife hänge ich die dann vorne an.

Code: Alles auswählen

var Length = myBin.length;
var VorneDran = "0"
var VorneDran = 8 - Length
for(i=0; i<VorneDran; i++)
 {
 myBin = "0" + myBin
 } 
Wie gehts weiter? Jetzt schneide (Slize) ich die einzelnen Bits auf:
Was steht am Montag für ein Bit

Code: Alles auswählen

var Montag = myBin.slice(7,8);
0 1 0 0 0 0 0 1

Richtig eine 1. das merken wir uns.
Dienstag usw.

Code: Alles auswählen

var Dienstag = myBin.slice(6,7);
Jetzt bauen wir uns dien Wochenprogramm - String zusammen, ein Tag nach dem Anderen:

Code: Alles auswählen

if(Montag == 1) {Woche = "Mo "}
if(Dienstag == "1") {Woche = Woche + "Di "}
if(Mittwoch == "1") {Woche = Woche + "Mi "}
if(Donnerstag == "1") {Woche = Woche + "Do "}
if(Freitag == "1") {Woche = Woche + "Fr "}
if(Samstag == "1") {Woche = Woche + "Sa "}
if(Sonntag == "1") {Woche = Woche + "So "}
Und am Schluss ab in den Datenpunkt:

Code: Alles auswählen

setState('javascript.0.Robonect.WochenTimer', Woche); 
Hab ich was vergessen? Kann ich was anders, besser machen, Feedback ist wilkommen.

Viel Spaß, Andi :)

P.S.