Ups, sorry... ich wusste, da war noch ein zweiter Teil...
JSON -> JavaScript Object Notation. Es handelt sich also um eine Form, Objekte in Textform zu speichern. Dabei kann ein Objekt mehrere Eigenschaften haben, die dann gewöhnlich hierarchisch strukturiert sind. JSON definiert, wie diese Struktur aussehen muss. Das Ganze heißt zwar JavaScript ... ist aber dank der guten Lesbarkeit bei gleichzeitig geringem Overhead auch bei vielen anderen Programmiersprachen und allgemein als Datenformat sehr beliebt.
XML ist ja ähnlich aufgebaut, erfordert aber meist weitere externe Quellen, um es vollständig abzubilden. Der Overhead ist bei XML dank der TAGS höher.
JSON ist JSON und ohne weitere Beschreibung gültig. Gewöhnlich kann man auch ohne Dokumentation anhand eines JSON Beispiels direkt erkennen, wie man auf die Daten zugreifen muss.
JavaScript ist eine Programmiersprache. JavaScript ist dabei
nicht Java, es ist tatsächlich weit von Java entfernt, wobei ich kein Programmierer bin und die Unterschiede nicht erklären kann. An vielen Stellen werden einem Dinge bekannt vorkommen, aber das ist bei Python und PHP auch so, und sogar C in seinen verschiedenen Ausprägungen kann Ähnlichkeiten aufweisen und hat doch so gar nichts mit JavaScript zu tun.
Literatur zu dem Thema habe ich keine zur Hand, sowohl für JavaScript als auch für Java gibt es so viel Literatur, dass man damit vermutlich nie fertig wird...
Bezüglich der Umrechnung in eine lesbare Zeit habe ich das bei mir schon mit Scripten gelöst, hier per JavaScript über transformation. Entsprechend die Datei
/etc/openhab/transform/secinhms.js (SecondsInHourMinuteSecond - aber in der Kürze liegt die Würze):
Code: Alles auswählen
(function(seconds){
var retval = "";
var hours = Math.floor(seconds / 3600)
seconds = seconds % 3600
var minutes = Math.floor(seconds / 60)
seconds = seconds % 60
if (hours < 10)
retval = retval + "0";
retval = retval + hours + ":";
if (minutes < 10)
retval = retval + "0";
retval = retval + minutes + ":";
if (seconds < 10)
retval = retval + "0";
retval = retval + seconds;
return retval;
})(input)
Die Funktion kann aus einer Rule heraus mit
angesprochen werden.
Der Code funktioniert folgendermaßen:
Zunächst wird ein leerer String retval angelegt. Nun werden die Stunden ermittelt, indem der Ganzzahlanteil des Ergebnisses der Division durch 3600 bestimmt wird. Also z.B. 10000 Sekunden ergibt 2, weil 3600 zweimal in die 10000 passt.
Nun werden die Sekunden auf den Rest reduziert, und zwar mit dem Modulo Operator %. Hier wird also der Rest der Division als Ergebnis behalten, also im Beispiel 2800. Das gleiche Spiel findet erneut statt, diesmal aber für die Minuten. Eine Minute hat 60 Sekunden, also kommt hier der Divisor 60 zum Einsatz. Das Ergebnis ist 46, weil die 60 eben 46 mal in die 2800 passt. Anschließend die Modulo Operation wie gehabt. Das Ergebnis ist hier 40.
Zum Abschluss wird der String zusammengebaut. Bei weniger als 10 Stunden wird eine 0 ergänzt. Dahinter folgt ein Doppelpunkt und eine führende 0 für die Minuten, falls es weniger als 10 Minuten sind. Wieder ein Doppelpunkt als Abgrenzung zu den Sekunden und ein letztes Mal die führende 0, falls benötigt. Als Ergebnis sateht dann im String, der zurückgegeben wird "02:46:40"
Auf Wunsch kann die führende 0 für die Stunden natürlich auch entfallen, dann lässt man die beiden Zeilen dafür einfach weg.
Man könnte die Sekunden aber auch in ein DateTime Item speichern (im korrekten Format natürlich...) und das Item auf die Anzeige von Stunden, Minuten und Sekunden konfigurieren. Allerdings wird die Anzeige dann maximal 23:59:59 erlauben, irgendwas ist ja immer...