FHEM 3D Oberfläche

Begonnen von wseiler, 08 Mai 2014, 07:37:11

Vorheriges Thema - Nächstes Thema

marvin78

Steht doch oben.

Zitat von: Prof. Dr. Peter Henning am 17 September 2014, 09:52:42
(Für die folgenden Beispiele bei Nachfrage bitte als gast/gast einloggen)

wseiler

Guten Morgen, hallo Professor pah,

hatte ich auch schon drüber nachgedacht ...

Punkt 1) und 3) Gebäudemodellierung für Jedermann und XML:

Ich hatte das mit der XML schon probiert und das Modell aus Koordinaten und Dimensionen einzelner  Wände und - zunächst mal - Fenster und Türen aufgebaut. Das klappt, wenn man sich auf einen Maßstab (Streckungsfaktoren) und einen Offset (x,y,z) geeinigt hat.
Allerdings braucht der, der die Koordinaten aus der Zeichnung übernimmt und in eine XML oder eben ein interaktives Tool eingibt trozdem auch etwas räumliches Vorstellungsvermögen um das Ganze zu modellieren.

Ich habe das dann danach mit Sweethome3D für das "Grundmodell" probiert und war (mit automatischer Übernahme der Grundriss-Scans) viel schneller am Ziel. Für die Fenster und Türobjekte habe ich dann die Eigenschaften (wie in der XML schon beschrieben) übernommen ... fertig.

Wenn man das interaktiv für alle - auch ungeübten - User machen will, müsste man m.E. ein 3D Tool mit Drag und Drop zur Verfügung stellen, bei dem die üblich zu monitorenden/ automatisierenden Elemente (Fenster, Türen, Lampen, ... etc.)  mit generiert/ ausgewählt und platzieren werden können. Das wäre mit begrenzten Aufwand machbar ... vermutlich geht das sogar mit irgendeinem fertigen Programm (SH3d o. ä.)wenn man die Elementdefinitionen versteht und für seine Belange anpasst.

Mein Hauptspielfeld war allerdings erstmal, mein 3D Modell durch die Übernahme der Daten animiert zu bekommen, das klappt ja schon ganz gut ;o) ...

Textur aus Gebäudefotos wäre auch kein großes Thema (hast Du ja schon realisiert), allerdings habe ich lieber die Wände durchsichtig gemacht (wie man im Beispielfilm sieht) weil damit der Überblick besser ist.
Meinen weißen Rauhputz auf das Modell zu legen hätte keine tieferen Einsichten erzeugt  ;)
Ich glaube das Texttur-Thema wird innen interessanter, wenn man (Ambiente-)Szenen mit Simulation des echten Lichteinfalls etc. erzeugen möchte ...

Ich habe mich mal durch die Links geklickt, es allerdings auf die Schnelle noch nicht geschafft, irgendwo ein 3D Gebäudemodell zu finden ... ein youtube-Filmchen - ohne Password - wäre sicherlich für die Interessierten hilfreich um sich Appetit zu holen.


Icinger

Hat der Professor eh geschrieben oben:

gast / gast
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

msfox

Zitat von: gandy am 31 August 2014, 14:45:54
Hallo Wolfram,
Für die Übergabe von devicestates hänge ich mich an die fhemweb eigene Infrastruktur, muss also keinen zusätzlichen longpoll Kanal öffnen.
(Ich hoffe es geht ok, wenn ich mich an den Thread hänge; das Thema passt ja)
Kann diesen Satz mal jemand näher erläutern?

Zum meinem Problem:
Ich bin soweit, dass ich mit einem Architekturprogramm (Arcon) mit dem Umweg über Blender mein Erdgeschoss in eine obj- und mtl-Datei gebracht habe. Diese habe ich via Threejs im Browser rotierend eingebauden. Das Erdgeschoss dreht sich nun. Die HTML-Datei liegt im Verzeichnis ../fhem/www/animation/ und wird im Floorplan via FRAME eingebunden. Soweit schickt...
Jetzt würde ich gern die Schaltzustände (Homematic) via javascript mit abfragen. Bei meiner Suche bin ich auf jsonlist2, xmllist und longpoll gestoßen, weiß aber nicht so recht, wie ich dies kombinieren soll.

Variante 1 (was ich eigenlich nicht will): Via JavaScript baue ich eine Endlosschleife, welche jede Sekunde(?) die gesamt xmllist aller Geräte und ihre Zustände abfragt, parst und die Sichtbarkeit von Objekten im 3D (z.B. Rollo) setzt. Die Lösung scheint mir aber recht Netzwerk intensive, da ja jede Sekunde die Abfrage vom Client zum Server (FHEM) stattfindet.
Variante 2: Wenn ich longpoll richtig verstanden habe, kann ich mich bei FHEM registrieren und bekomme ein Event, wenn sich ein Schaltzustand ändert.
Geht das, wen ja wie?
Was ich nun nicht gefunden habe, ob der Schaltzustand und das Gerät bei diesem Gerät mit geliefert werden. Wenn nicht, könnte man dies ja über xmllist herausbekommen.

Danke für eure Hilfe...


gandy

Hi, mein Vorhaben ist recht bald eingeschlafen, weil ich mit dem Blendermodell meiner Wohnung nicht so recht weiterkommen bin. was ich aber geschafft hatte, war die beeinflussung einzelner threejs Objekte über javascript in abhängigkeit von Zuständen bestimmter fhem Devices, sogar mit fließenden Bewegungen. An den Code komm ich grade nicht ran, werd aber gern versuchen ihn nochmal rauszukramen.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

justme1968

1 solltet du auf keinen fall machen. nur ein mal beim starten mit xmllist holen was du brauchst. sonst legst du fhem lahm.

2 geht natürlich. ein beispiel findest du z.b. im homekit shim hier: http://forum.fhem.de/index.php/topic,32652.msg317190.html#msg317190

inklusive ein mal jsonlist beim start, holen von readings, registrieren für longpoll, cachen, und callbacks.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

msfox

#21
In dem Thread http://forum.fhem.de/index.php/topic,32652.msg317190.html#msg317190 ging um Homebridge, iOS, Siri,... Nur um die Syntax für die Einbindung von longpoll zu erfahren, will nix unnützes installieren. Im Grunde ist ja das was ich brauche im FHEM schon vorhanden.

Zu Blender: Beim Import der 3DS-Datei in Blender habe ich auch versucht, einige Dinge nachzuarbeiten. Blender ist hier aber recht umfangreich und sicher nicht in 5min erlernt. Ich hab ihn daher nur als Konvertierungstool verwendet. Hier im Thread wurde ja schon auf SweetHome3D hingewiesen. Wie geschrieben habe ich mein (zukünftiges) Haus in ArconElco geplant, was (offiziell) nicht ganz günstig ist.

Prof. Dr. Peter Henning

Arcon Eleco verwende ich seit vielen Jahren...

LG

pah

justme1968

#23
es ging nicht darum etwas unnützes zu installieren sondern um ein ziemlich komplettes beispiel wie man jsonlist und longpoll von node.js aus verwenden kann.

du kannst natürlich gerne auch selber alles zusammen suchen statt zu fragen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

gandy

Anbei ein wenig unsortierter Code, um per weblink einen TreeJS-Bereich einzubinden, der ein Modell langsam rotierend anzeigt. Die Verzeichnisse 3d und threejs gehen nach fhem/www. Die Datei 3d/fhem.conf enthält die Konfiguration für zwei Dummies und den ThreeJS-weblink dazu. Der Pfad in letzterem muss entsprechend angepasst werden. Wenn alles funktioniert hat, gibt es einen neuen Raum "ThreeJS", in dem oben die beiden Dummies und darunter das 3D-Modell angezeigt werden. Einer der Dummies (td1) hat verschiedene Werte, die man anklicken kann, woraufhin sich die vertikale Position der grünen Box verändert. Dafür wird die Funktion FW_myThreeJs3DviewUpdateLine() bei FW_widgets registriert. In init() wird dann noch der longpollfilter ein wenig aufgeweitet (.*), damit alle Events ankommen, hier könnte man bestimmt ansetzen wenn optimiert werden soll.

Den Code habe ich aus ThreeJS Demos abgeleitet, er ist sicher nicht schön, aber zumindest ein funktinierendes Demo, aus dem man das ein oder andere vielleicht wiederverwenden kann. Wie man longpoll so nutzt, dass nicht alles explodiert, lässt sich sicher besser aus Andres Tipp ableiten.

Hoffentlich habe ich alle relevanten Dateien erwischt, wenn was fehlen sollte oder nicht funktiert, sag Bescheid.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

Prof. Dr. Peter Henning

Usability spielt keine Rolle, oder wie ?

Es gilt immer: Form follows function. Und da muss man klar sagen, dass die Bedienung innerhalb einer Pseudo-3D-Umgebung keinerlei  Vorteile gegenüber einer zweidimensionalen Anzeige bietet.

LG

pah

gandy

Die Aussage ist sicher richtig, aber stimmt der Kontext? Wer es nicht cool findet oder für sich einen Vorteil darin sieht, seine Wohnung als dynamisches 3D Objekt im Floorplan zu haben, lässt es. Andererseits kommt man beim Spielen mit den Möglichkeiten immer wieder auch auf Sinnvolles. Aber wem sag ich das...
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

wseiler

Hallo,

'tschuldigung dass ich mich einmische, aber das war mal mein Post  :) :).

Also 3d ist eine schöne Spielerei, deswegen hatte ich das auch angefangen. Allerdings hat das auch einen (bzw. mehrere) sinnvolle Nutzen.
Wenn ich mein Haus verlasse, sehe ich auf einen Blick wo ich noch hinrennen und die Fenster bzw. Türen zumachen muss.
Dass ist in 3d intuitiv(er), weil es halt aussieht wie in echt. Hilft bei der Orientierung und bei der Entscheidung (aha, nur im Obergeschoss Fenster offen, alles gut)
Deswegen verwendet man solche Techniken ja auch um im Ernstfall (z.B. Feuer) Fluchtwege zu zeigen etc.
Klar geht das irgendwie auch in 2d aber halt nur 2.-best  :).

Ich lass dass Haus nicht von selbst drehen, sondern drehe oder zoome per Maus wohin ich will.
Im Prinzip reicht die Aktualisierung der "Zustände" beim Aufrufen des Modells, ansonsten kann man z.B. x-minütlich aktualisieren (stört die Netzlast quasi nicht, ist ja nur solange man diesen Screen hat).

Dann war früher noch mal die Frage nach Apples IOS - Devices und threejs. Geht inzwischen alles, getestet am Iphone 4s u. 5 sowie am Ipad 2 u. 3. und auf Android Devices, am PC sowieso !!!
Bei IOS war das etwas langsam, v.a. im Fernzugriff (mit dem Modell aus Sweethome3D), wenn man auf die Details der einzelnen Zimmer verzichten kann und das Haus und Garage nur als Quader in threejs programmiert, dann geht das pfeilschnell auch per VPN / Fernzugriff; schaut halt etwas einfacher aus. Ich habe dann einfach 2 Menuepunkte gemacht, schön und schnell für Heimzugriff, nicht so schön und trotzdem schnell für Fernzugriff.

Wenn Interesse besteht, kann ich wieder mal ein Filmchen einstellen, allerdings bin ich erstmal 2,5 Wo weg.











msfox

ich hab's....
folgende js-Datei wird in meiner HTML-Datei, welche die 3D-Objekte erstellt eingebunden. Durch Aufruf der Methode FW_longpoll() wird das Longpoll aktiviert und somit die Methode FW_doUpdate3D() registriert, welche bei jeder Zustandsänderung des Sensors durchlaufen wird (Kurzfassung aus fhemweb.js). Die 3D-Objekt, welche sichtbar/unsichtbar geschaltet werden sollen, befinden sich in einer "Map". Im doUpdate3D() werden sie anhand der ID des Sensor aus der Map gelesen und je nach Schaltzustand ein oder aus geblendet.

/*************** LONGPOLL START **************/
var FW_pollConn;
var FW_curLine; // Number of the next line in FW_pollConn.responseText to parse
var FW_leaving;
var isIE = (navigator.appVersion.indexOf("MSIE") > 0);
var isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/);

function
log(txt)
{
  if(typeof window.console != "undefined") // IE
    console.log(txt);
}

function
addcsrf(arg)
{
  var csrf = document.body.getAttribute('fwcsrf');
  if(csrf && arg.indexOf('fwcsrf') < 0)
    arg += '&fwcsrf='+csrf;
  return arg;
}

function
FW_doUpdate3D()
{
  if(FW_pollConn.readyState == 4 && !FW_leaving) {
    FW_errmsg("Connection lost, trying a reconnect every 5 seconds.", 4900);
    setTimeout(FW_longpoll, 5000);
    return; // some problem connecting
  }
 
  if(FW_pollConn.readyState != 3)
    return;

  var lines = FW_pollConn.responseText.split("\n");
 
  //Pop the last (maybe empty) line after the last "\n"
  //We wait until it is complete, i.e. terminated by "\n"
  lines.pop();
  var devs = new Array();
  for(var i=FW_curLine; i < lines.length; i++) {
    var l = lines[i];
    var d = l.split("<<", 3);    // Complete arg

    if(d.length != 3)
      continue;

//objectList wird in der HTML-Datei mit den 3D-Objecte gefüllt
//<sensorID> : <3D-Object>
//Bsp: objectList["HMW_LC_Sw2_DR_LEQ0116953_04"] = lampe;
if(objectList[d[0]])
{
if (d[1] == 'on')
objectList[d[0]].visible = false;
if (d[1] == 'off')
objectList[d[0]].visible = true;
}
  }
 
  // reset the connection to avoid memory problems
  if(FW_pollConn.responseText.length > 300*1024)
    FW_longpoll();
}

function
FW_longpoll()
{
  log("Connecting...");
  FW_curLine = 0;
  if(FW_pollConn) {
    FW_leaving = 1;
    FW_pollConn.abort();
  }

  FW_pollConn = new XMLHttpRequest();
  FW_leaving = 0;
 
  //Wenn die HTML-Datei direkt im Floorplan integriert ist, kann
  //der Pfad der Geräte dynamisch aus top.document.location.pathname
  //gebildet werden.
  //Lesen des Pfades über top.document, falls die JavaScript in einer
  //eingebetter Webseite gerufen wird.
  var query = top.document.location.pathname+"?XHR=1&inform=type=status;filter=.*;&timestamp="+new Date().getTime();
  //Fest codiert für den Test, wenn HTML-Seite "standalone"
  //query = "/fhem/floorplan/LCARS_EG?XHR=1&inform=type=status;filter=.*;&timestamp="+new Date().getTime();
  query = addcsrf(query);
  FW_pollConn.open("GET", query, true);
  //FW_doUpdate3D: JavaScript-Function, welche bei Änderung gerufen wird.
  FW_pollConn.onreadystatechange = FW_doUpdate3D;
  FW_pollConn.send(null);
}

window.onbeforeunload = function(e)
{
  FW_leaving = 1;
  return undefined;
}

Zum besseren Verständnis erhält das Script nur das wirklich nötigste. Es ist z.B. nicht möglich, Objekte je nach Schaltzustand auszutauschen, usw.

Achja: Ziel der 3D-Darstellung soll es nicht sein, darin irgendwas zu schalten. Es dient nur der Visualisierung. Das 3D-Model ist ein LCARS-Layout eingebunden.

gandy

Funktioniert das auch für mehrere 3D-Views auf einer Seite? Und hast Du einen Screenshot deines LCARS Interface, den Du teilen möchtest (mit 3D-Objekt nicht völlig off-topic)?
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1