Ankündigung

Einklappen
Keine Ankündigung bisher.

Logikengine, java powered

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #61
    Bin etwas hin und her gerissen....

    Die Umrechnung im Backend macht es bzgl. der Konfiguration leicht.
    Aber mit der Transformation im Frontend/der Visu hat man noch die Möglichkeit anpassungen vorzunehmen. z.B. das Thema Nachkommastellen und die Rundung solcher.

    Max, hast du eine Art Konfigurationsmöglichkeit pro Adresse im Backend? D.h. die eine Adresse so, und die andere Adresse, vom gleichen Typ anders ausgeben?

    Das man dafür Typen o.ä. in der Visu hinterlegen muss, liegt m.M.n. in der Natur der Sache und ist "normal".
    Hab mir den Satz nochmal durch den Kopf gehen lassen: Eigentlich liegt es nicht in der Natur der Sache. Wenn ich vom Backend den Wert einer Adresse anfordere die eine Temperatur darstellt, dann muss da ein Temperaturwert zurück kommen.
    Eigentlich kann man nur drüber streiten ob eine oder zwei Nachkommestellen. Eigentlich eindeutig.

    Aber es gibt auch Ausnahmen: DPT2 ... Wie würde man das angeben? Prinzipiell auch als 1 und 0. Je nachdem ob geschaltet/an oder nicht/aus. Aber es gibt da noch das Control-Bit. Da müsste man sich dann etwas überlegen. z.B. 0/1/c0/c1 ... Und auf der Visuseite macht man damit dann was? Richtig, man müsste es wieder transformieren/ausseinander nehmen. In diesem Fall wäre es geschickter man würde den Rohwert übermitteln. Dann kann man es sich auf Visu-Seite noch aussuchen was man damit macht. Das gleiche könnte man aber auch von 0/1/c0/c1 sagen.
    Vorteil der Transformation im Backend: Man muss in den meisten Fällen keine Transformation in der Visu konfigurieren.
    Aber es gibt ja auch ausnahmen... Ich hab noch keinen Schimmer was es alles für Controls in CV gibt und was die so von sich geben.

    DPT3.008 "Control blinds" transportiert wie DPT2 einen zusammengesetzten Wert: Einmal die Richtung, und einmal die Schrittweite.

    Hier fehlt mir noch die Praxiserfahrung ob man solche Fälle in der Visu braucht und was z.B. die CV da an Daten von sich gibt wenn man den entsprechenden Button drückt... oder ob solche Fälle einfach durch einen alternativen Ansatz abgefangen und vermieden werden.

    Meine gestrigte Tendenz zur Transformation in der Visu schwankt gerade wieder in die andere Richtung.

    ABER ich überlege gerade ob ich das nicht mit dem NAMESPACE aus dem CV Protokoll abdecke. Der ist eigentlich dafür gedacht Adressarten voneinander zu unterscheiden, bzw. auch im Fall von KNX GAs von iKOs...
    Aber in diesem Fall könnte man den Namespace auch verwenden, um zwischen RAW und TRANSFORMED umzuschalten. Somit könnte man ein und dieselbe Adresse einmal im Rohformat und einmal im bereits tansformierten Format abrufen. Würde dann aber keinen großen Aufwand betreiben für die Visu eine Transformationsklasse zu basteln, da dies ja nur in Ausnahme/Sonderfällen benötigt wird.

    Aktuell grübel ich noch über der Architektur für den zentralen KNX-Teil des KAD/Backends... Werde hier experimentieren und ne weile testen müssen.

    Kommentar


      #62
      Hallo Alex,

      in meinem Backend (smarthome.py) gibt es keine mir bekannte Konfigurationsmöglichkeit. Das KNX-Plugin könnte zwar theoretisch DPT5.004 in 0%...100% umrechnen, tut das m.W. aber nicht. Ich rechne, wenn notwendig, dann in einer entsprechenden Logik um. DPT9 dagegen wird natürlich umgewandelt, mit dem 16bit-Rohwert fängt man ja nichts Vernünftiges an.

      Noch ein Argument für Umrechung im Backend: stelle dir die Integration von KNX und einem anderen System (z.B. EnOcean) vor. EnOcean liefert einen Zielwert 0..100, das KNX-Device erwartet DPT5.004 (0..255). Kann ich in einer Logik umrechnnen, fände es aber besser, wenn das schon vom KNX-Plugin abstrahiert würde.

      Konsequenterweise müsste man dann DPT2 und DPT3 in ein Array transformieren - wäre in Python und in JSON problemlos abbildbar, in Java ggf. etwas aufwändiger(?). Ich fände es aber durchaus sinnvoll. Nicht zuletzt deswegen, weil du ja einen direkten Import aus der ETS machst und damit die Datentypen alle vorliegen hast. Ich müsste sie in der Visu manuell einpflegen (wobei ein entsprechendes Visu-Konfig-Tool das natürlich auch aus der .knxproj ziehen könnte, allerdings dann wieder KNX-only wäre).

      Allerdings: DPT2 habe ich in freier Wildbahn noch nicht gesehen, und DPT3 sehe ich in der Visu als nicht notwendig an (und bezweifle, dass man es in der Logik braucht). Die Visu operiert typischerweise mit Zielwerten. Ich sehe nicht wirklich die Notwendigkeit, an einem Visu-Panel per Buttondruck heller und dunkler dimmen zu können, sondern gebe z.B. direkt 40% vor (bzw. erhalte nach Abschluss des Dimmens vom Dimmaktor den neuen Status und zeige ihn an).
      Falls das jemand anders sieht, freue ich mich über einen Kommentar.

      Gruß,

      Max

      P.S.: 3.008 transportiert keine Schrittweite, sondern "Zwischenstopp-Werte", bei denen das Dimmen/Jalousieverstellen von selbst stoppt. Bin da mal reingefallen und musste bei meinem Dimmer die Firmware nachbessern. Schrittweite hätte ich auch plausibler gefunden.

      Kommentar


        #63
        Dann würde ich hybrid fahren, raw und interpretiert, weil es vllt für den knx Typ eine sinnvolle Abbildung gibt. Das scheinen sowieso verschiedene Dinge zu sein: Interpretation und normale ui/locale mäßige Formatierung. Wenn du das trennst hast du viel benötigte common sense interpretation im backend, Möglichkeit davon abzuweichen im Frontend (raw) und das übliche decimal point gefrickel & Co. Nur im Frontend, wie üblich

        Kommentar


          #64
          Zitat von hotzen Beitrag anzeigen
          Dann würde ich hybrid fahren
          Würde ich auch gern. Aber der Preis ist so ne Sache. Und bei meiner vielen überlandfahrt die ich Werktags mache, komm ich elektrisch nicht so weit und muss doch wieder mit Sprit fahren *scnr*

          Spaß bei Seite... Ich fang jetzt mal mit interpretiert an und raw kann ich dann noch nachschieben.

          Kommentar


            #65
            So, ein erstes Ergebnis meines Experiments mit dem übersetzen der Werte im Backend:

            Geht eigentlich ganz gut. Nur geht die zugrundeliegende Calimero-Lib ein klein wenig zu weit, bzw. macht es etwas anders als gedacht:

            Zwei Beispiele:

            Auf eine GA mit DPT1.001 eine "1" oder "0" schreiben geht nicht. Calimero frisst hier nur "on" bzw. "off".
            Eine GA mit DPT9.001 lesen geht. Aber man bekommt nicht "21.5", sondern "21.5 °C".

            Aktuell würde ich vorsehen, die Werte vor dem Schreiben ggf. automatisiert "anzupassen" (also aus "0" wird im Fall von DPT1.xxx dann ein "off", so dass Calimero sich nicht beschweren kann). Und beim lesen wird auch nochmal "korrigiert" (also aus "21.0 °C" wird dann im Fall von DPT9.001 "21.5").

            Das macht die Sache ein wenig aufwendiger in der Implementierung (gibt ne ganze Latte voll DPTs die man so "korrigieren" müsste), aber damit könnte ich leben.

            Bzgl. des "Knx Service-Plugins": Hier hab ich schon angefangen Interfaces zu schreiben.
            Ziel ist ein zentraler Service, den man nach einer KNX-Zugriffs-Instanz fragen kann. Mit dieser Instanz kann man lesen, schreiben und sich für Gruppenadress-Events registrieren.
            Intern werden dann vom Service alle Zugriffe synchronisiert und auf dem Bus ausgeführt. Da der Bus bit 9600 Baud wohl deutlich langsamer ist als z.B. ein RaspberryPi schnell ist, sollte nicht die Synchronisierung der limitierende Faktor sein, sondern der Bus selbst. Kurzum: Diese Designentscheidung wird kein Nadelöhr werden.

            Bzgl. Tunnel / Routing hab ich auch schon eine Lösung: Calimero kann man soweit ich das gesehen hab, jederzeit eine andere PhysikalischeAddresse zum Senden geben. Da alles synchronisiert ist braucht man 1) nur eine Verbindung zum Router/IP-Schnittstelle und 2) wird diese vor dem Senden mit der passenden PA versehen.

            Muss das noch praktisch ausprobieren, aber ich denke nicht dass es hier zu einer Überraschung kommen wird.

            Kommentar


              #66
              Was/wofür ist denn "Knx Service-Plugins", wenn lt. Dir eine Calimero Instanz ausreichend ist um (bereits synchronisiert) mit beliebigen PA auf den Bus zu gehen?

              Kommentar


                #67
                Calimero synchronisiert da nix. Da kümmert sich der Service darum dass mit einer einzelnen "Calimero Instanz" jeder mit seiner PA agieren kann. Außerdem abstrahiert er Calimero damit die Benutzung einfacher wird.
                Zuletzt geändert von tuxedo; 17.10.2015, 19:48.

                Kommentar


                  #68
                  So, kleines Info-Update:

                  ich bin dabei den KnxService zu implementieren. Dabei sind wirklich viele unrunde Ecken und Kanten aufgefallen die erstmal gerade gezogen werden müssen.

                  Jüngstes Beispiel das ich soeben gerade gezogen habe:

                  Der ETS4Reader liest ein .knxproj Datei, so dass man Zugriff auf das Tupel "GA<->DPT<->NAME" hat.
                  Fehlt im ETS Projekt die DPT Info einer GA, weil diese entweder noch keinem Gerät zugeordnet ist, oder weil die GA für irgendwelche Basteleien außerhalb der ETS gebraucht wird (z.B. Arduino KNX Projekte, oder ein Software-KNX-Gerät das man in ETS nicht konfigurieren kann), so wird versucht die Info aus einer foobar.knxproj.user.xml Datei zu ziehen. Diese sieht exemplarisch so aus:

                  Code:
                  <?xml version="1.0" encoding="UTF-8"?>
                  <knxprojectuserconfiguration>
                    <ga address="3/6/100" dpt="7.001" />
                    <ga address="0/0/2" dpt="1.001" name="Test2" />
                    <ga address="0/0/1" dpt="1.001" />
                  </knxprojectuserconfiguration>
                  Darin kann man dann eine GA mit DPT und ggf. auch Name hinterlegen. Die hier gefundenen Werte haben vorrang gegenüber Werten die aus dem Projekt extrahiert wurde.
                  D.h. ich kann hiermit auch eine GA zwangsweise einen anderen DPT zuordnen, oder einen anderen Namen geben.

                  Der Clou: Wenn der Benutzer die File nicht angelegt und alle Adressen mit fehlendem DPT eingetragen hat, dann wird die File mit leerer DPT-Info erzeugt. Die Einträge sehen dann so aus:

                  <ga address="5/0/13" dpt="">
                  <!--Präsenz Flur DG-->
                  </ga>
                  <ga address="5/0/12" dpt="">
                  <!--Präsenz Büro-->
                  </ga>
                  <ga address="5/0/11" dpt="">
                  <!--Präsenz Gast-->
                  </ga>
                  <ga address="5/0/10" dpt="">
                  <!--Präsenz Kind2-->
                  </ga>
                  <ga address="5/0/9" dpt="">
                  <!--Präsenz Kind1-->
                  </ga>
                  Wozu? Man spart sich das manuelle anlegen der GA in der File. Man muss nur noch den DPT eintragen. Fertig.
                  Als Hilfe wird noch ein Kommentar dazu mit dem Namen der GA aus ETS eingetragen. Ich hab's bewusst nicht in das "name"-Attribut gesteckt, weil sonst der Name aus der ETS überschrieben wird und so Namensänderungen in der ETS sich in KAD nicht niederschlagen. Deshalb nur als Hilfe im Kommentar.

                  So, weiter zum KnxService ... Es ist noch viel zu tun...
                  Zuletzt geändert von tuxedo; 17.10.2015, 22:12.

                  Kommentar


                    #69
                    Weiter im Monolog:

                    Ich hab das ganze Projekt anfassen müssen damit es wieder einigermaßen funktioniert. Dafür gibt es jetzt einen zentralen Service, der mit einer einzigen Verbindung zum KNX Bus auskommt, jedoch von vielen - sogar mit eigener PA - genutzt werden kann.
                    In einem zukünftigen Schritt wird das ganze konfigurierbar, so dass man zwischen Tunnel und Routing wählen kann.

                    Der Umbau hat allerdings ein paar Folgen nach sich gezogen:

                    Alles was den KnxService nutzt (also bisher wirklich alles, nämlich die ogikengine sowie das CV backend) arbeitet jetzt mit Namensadressen ("GA Name"). D.h. mit dem Namen der GA ("Licht schalten Büro") statt mit der GA selbst ("1/1/130").
                    Von der gleichen Änderung betroffen ist das handling der Werte die vom Bus "empfangen" und "geschrieben" werden. Auch hier ist ein String die gemeinsame Basis.

                    D.h. Temperaturen werden nicht als Integer, Double oder Float behandelt, sondern treffen als String ("21.5") ein und müssen auch so gesendet werden.
                    Das macht die Sache in den Scripts vorerst etwas unschöner, macht aber die Implementierung des zentralen Services einfacher.

                    Die Logik-Klasse, von der jedes Script erben muss, bekommt demnächst noch diverse konverter-Methoden, mit denen es dann einfacher wird.

                    Bisher sieht das z.B. so aus:

                    Code:
                    package de.root1;
                    
                    import de.root1.kad.knxservice.KnxServiceException;
                    import de.root1.kad.logicplugin.Logic;
                    
                    public class LichtAutoAusBadEG extends Logic {
                    
                        String gaLichtBad = "Licht Raumschaltung Bad EG";
                        String gaPräsenzBad = "Präsenz Bad";
                                
                        boolean lastState = false;
                                        
                        @Override
                        public void init() {
                            setPA("1.1.100");
                            listenTo(gaPräsenzBad);
                        }
                                                                        
                        @Override
                        public void onData(String ga, String value) throws KnxServiceException {
                            boolean state = getValueAsBoolean(value); // get presence state from knx event
                            log.info("Received presence state: {}", state);
                            if (lastState && !state) { // if presence is gone ...
                                write(gaLichtBad, getBooleanAsValue(false)); // ... turn off the light
                                log.info("Light Auto-OFF");
                            }
                            lastState = state; // store last state
                        }
                                                                                                                                                                                        
                    }
                    Für Boolean gibt es bereits einen Konverter in beide Richtungen (String->Boolean, Boolean->String).
                    Vielleicht fällt mir auch noch etwas besseres ein. Mal schauen.

                    Das weiterleiten der KNX-Events an die Logiken ist ebenfalls verbessert: Jede Weiterleitung erfolgt in einem eigenen Thread.

                    Hier mal die KAD Konsole, hoffentlicjh auch für "Normalsterbliche" bzw. Nicht-Entwickler lesbar:

                    Code:
                    2015-10-18 14:23:30.455 INFO [main] java.util.logging.LogManager$RootLogger.log: Set formatter to de.root1.logging.JulFormatter
                    2015-10-18 14:23:30.618 INFO [main] de.root1.kad.pf4j.JarPluginManager.createPluginsDirectory: Using pluginsdir: plugins @ deployment
                    2015-10-18 14:23:30.624 INFO [main] ro.fortsoft.pf4j.DefaultPluginManager.initialize: PF4J version 0.0.0 in 'deployment' mode
                    2015-10-18 14:23:30.661 INFO [main] ro.fortsoft.pf4j.DefaultPluginStatusProvider.initialize: Enabled plugins: []
                    2015-10-18 14:23:30.663 INFO [main] ro.fortsoft.pf4j.DefaultPluginStatusProvider.initialize: Disabled plugins: []
                    2015-10-18 14:23:30.680 INFO [main] de.root1.kad.KadMain.<init>: basedir:      /opt/kad
                    2015-10-18 14:23:30.682 INFO [main] de.root1.kad.KadMain.<init>: Mode:         deployment
                    2015-10-18 14:23:30.684 INFO [main] de.root1.kad.KadMain.<init>: devPluginDir: /opt/kad/../plugin-projects
                    2015-10-18 14:23:30.686 INFO [main] de.root1.kad.KadMain.<init>: pluginDir:    /opt/kad/plugins
                    2015-10-18 14:23:30.688 INFO [main] de.root1.kad.KadMain.<init>: Registering main services ...
                    2015-10-18 14:23:31.136 INFO [main] de.root1.kad.knxservice.KnxServiceImpl.<init>: Reading knx project data ...
                    2015-10-18 14:23:31.681 INFO [main] de.root1.kad.knxservice.KnxServiceImpl.readKnxProjectData: No change in knxproject data detected. Continue with cached values.
                    2015-10-18 14:23:31.683 INFO [main] de.root1.kad.KadMain.<init>: Loading Plugins ...
                    2015-10-18 14:23:31.788 INFO [main] ro.fortsoft.pf4j.DefaultPluginManager.resolveDependencies: Plugin 'de.root1.kad-cvbackend' resolved
                    2015-10-18 14:23:31.790 INFO [main] ro.fortsoft.pf4j.DefaultPluginManager.resolveDependencies: Plugin 'de.root1.kad-logicplugin' resolved
                    2015-10-18 14:23:31.811 INFO [main] de.root1.kad.KadPlugin.readConfig: Successfully read config from: /opt/kad/conf/de.root1.kad-cvbackend.properties
                    2015-10-18 14:23:31.830 INFO [main] de.root1.kad.KadPlugin.readConfig: No configfile: /opt/kad/conf/de.root1.kad-logicplugin.properties
                    2015-10-18 14:23:31.840 INFO [main] de.root1.kad.KadMain.<init>: Starting plugins ...
                    2015-10-18 14:23:31.842 INFO [main] ro.fortsoft.pf4j.DefaultPluginManager.startPlugins: Start plugin 'de.root1.kad-cvbackend:1.0.0'
                    2015-10-18 14:23:31.848 INFO [main] de.root1.kad.cvbackend.CometVisuBackendPlugin.start: requires user session: true
                    2015-10-18 14:23:31.900 INFO [main] de.root1.kad.cvbackend.CometVisuBackendPlugin.start: Started CometVisu backend server
                    2015-10-18 14:23:31.906 INFO [main] ro.fortsoft.pf4j.DefaultPluginManager.startPlugins: Start plugin 'de.root1.kad-logicplugin:1.0.0'
                    2015-10-18 14:23:31.910 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Starting Plugin de.root1.kad.logicplugin.LogicPlugin
                    2015-10-18 14:23:31.951 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Loading script: de.root1.LichtAutoAusBadEG
                    2015-10-18 14:23:36.237 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Initialize logic de.root1.LichtAutoAusBadEG ...
                    2015-10-18 14:23:36.239 INFO [main] de.root1.kad.logicplugin.Logic.listenTo: de.root1.LichtAutoAusBadEG now listens to [Präsenz Bad@5/0/2]
                    2015-10-18 14:23:36.241 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Loading script: de.root1.VOC
                    2015-10-18 14:23:36.950 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Initialize logic de.root1.VOC ...
                    2015-10-18 14:23:36.952 INFO [main] de.root1.kad.logicplugin.LogicPlugin.start: Starting Plugin de.root1.kad.logicplugin.LogicPlugin *DONE*
                    2015-10-18 14:23:36.954 INFO [main] de.root1.kad.KadMain.<init>: Running!
                    2015-10-18 14:23:39.440 INFO [KnxServiceOndataForwarding#1] de.root1.kad.logicplugin.LogicPlugin$1.onData: Forwarding value '1' with DPT '1.001' to [Präsenz Bad@5/0/2]'
                    2015-10-18 14:23:39.444 INFO [KnxServiceOndataForwarding#1] de.root1.LichtAutoAusBadEG.onData: Received presence state: true
                    2015-10-18 14:23:54.992 INFO [VOC reader] de.root1.VOC$1.run: Read VOC value: 857 exitvalue: 0
                    2015-10-18 14:24:54.972 INFO [VOC reader] de.root1.VOC$1.run: Read VOC value: 853 exitvalue: 0
                    2015-10-18 14:25:54.972 INFO [VOC reader] de.root1.VOC$1.run: Read VOC value: 855 exitvalue: 0
                    2015-10-18 14:25:56.895 INFO [KnxServiceOndataForwarding#1] de.root1.kad.logicplugin.LogicPlugin$1.onData: Forwarding value '0' with DPT '1.001' to [Präsenz Bad@5/0/2]'
                    2015-10-18 14:25:56.898 INFO [KnxServiceOndataForwarding#1] de.root1.LichtAutoAusBadEG.onData: Received presence state: false
                    2015-10-18 14:25:56.904 INFO [KnxServiceOndataForwarding#1] de.root1.LichtAutoAusBadEG.onData: Light Auto-OFF

                    Kommentar


                      #70
                      Hi Alex,

                      klingt toll - leider komme ich von meiner Seite mit deinem Tempo gerade nicht mal ansatzweise hinterher (Familie lässt grüßen). QVisu wird also noch ein bisschen dauern. Sorry.

                      Max

                      Kommentar


                        #71
                        ;-) Tipp: Nachts schläft die Familie. Da kann man in Ruhe arbeiten. Wenn dann nur nicht der lästige Wecker wäre der einem zum Brötchengeber delegiert :-(

                        Kommentar


                          #72
                          [Sorry, hoffnungslos offtopic]

                          Ja, das klappt ja auch einigermaßen...nur sind da noch so Dinge wie
                          • Fundament für die neue Müllbox betonieren (Betonstampfer sind ein nettes Spielzeug, große benzinbetriebene sowieso)
                          • Schrank unter der Kellertreppe (Hettich System 32 ist eine feine Sache, aber ein Haufen zu bohren, und man kann soooo leicht bei Planen und Messen danebenhauen)
                          • RGBW-Lichtstreifen für eine geflieste Ablage (mehr oder weniger eine Sparversion von Schlüter Liprotec) - die Ansteuerung per Funk ist noch offen, wahrscheinlich wird´s der Bilton-Dimmer mit EnOcean, dann brauche ich aber noch eine Funksteckdose zum Abschalten.
                          • Decke in der Küche abhängen, um das neue regierungsamtliche Leuchtenkonzept umzusetzen
                          • neuer, fest eingebauter, gefliester Küchentisch
                          • QVisu und der neue Layer 2 meines KNX-Stacks
                          • ...und als Grundlast die Wäsche für eine vierköpfige Familie

                          Weiß gar nicht, wann ich das letzte Mal vor dem Fernseher gesessen habe. Im nächsten Leben komme ich entweder mit zwei linken Händen oder mit zwei X-Chromosomen auf die Welt.

                          Max

                          Bild: Anlieferung der Box heute früh. Immerhin steht sie auf den ersten Blick ordentlich im Wasser.
                          You do not have permission to view this gallery.
                          This gallery has 1 photos.

                          Kommentar


                            #73
                            Zitat von l0wside Beitrag anzeigen
                            Im nächsten Leben komme ich entweder mit zwei linken Händen oder mit zwei X-Chromosomen auf die Welt.
                            *ymmd*

                            Kleines Update zum CV Backend:

                            Bin gestern dazu gekommen ein paar Seiten in meiner CV anzulegen um das Backend mal praktisch in Dauerbetrieb zu nehmen.
                            Das klappt auch schon recht gut. Hab hier und da ein paar Bugs gefixt, die Performanceschraube weiter abgezogen, den SSE KeepAlive für das aufrechterhalten der CV-Session verbessert und und und.

                            Aktuell hab ich nur zwei Probleme:

                            * Mein Nexus 4 will die CV Seite nicht mehr anzeigen und kommt über "Loading page ..." nicht mehr raus. Mein Xoro Megapad in der Küche (ebenfalls Android) hat damit aber keinerlei Probleme. Sehr seltsam. Hab noch kein Plan wie ich das debugge.
                            * Ich hab das Gefühl dass die Verbindung zwischen CV und Backend bei langer Laufzeit (d.h. offenhalten des Browsers) abreisst und die CV dann keine Verbindung mehr aufbaut. Muss ich untersuchen.

                            Bzgl. der Logikengine:

                            * Funktioniert bisher gut und stabil. Bin am überlegen ob ich den KnxService, der für das lesen und schreiben auf den Bus zuständig ist, noch um eine "respond"-Methode erweitere. Damit könnte man dann eine Logik als ein "KNX-Gerät" auslegen. Sprich: Man kann eine GA einer Logik zuordnen, so dass man vom Bus aus die GA abfragen und die Logik dann antworten kann.
                            Damit könnte man dann so nette Dinge wie mein HeliosKwlRemote oder mein Modbus2KNX direkt in einer Logik umsetzen. Ein anderer Einsatzzweck wäre bei mir z.B. dieser:
                            Meine Wärmepumpe liefert die Wärmemenge der Heizung über drei Adressen aus. Der Wärmemengenzähler ist nämlich 12-stellig. Jede der drei Adressen liefert 4 Stellen der 12-stelligen Zahl aus. Die CV ist damit wohl etwas überfordert. Mit einer Logik könnte ich eine Anfrage an eine GA für die zusammengesetzte Wärmemengenzahl eine Anfrage auf die eigentlichen drei GAs auslösen, die Werte einsammeln, zusammensetzen und als Ergebnis zurückliefern.


                            Für das CV-Backend bedarf es aktuell noch einer Anpassung der CV. Da hier gerade ein Release bevorsteht und keine großen/neuen Änderungen rein sollen, werde ich hier das Release abwarten und dann einen Pull-Request für die Anpassung erstellen.

                            Als nächstes großes Feature werde ich mir mal die Datenaufzeichnung und Visualisierung in Form von Graphen anschauen. Für meine Eltern hatte ich mal was mit der Google Graph API gemacht: https://developers.google.com/chart/
                            Hat auch gut funktioniert:
                            googlegraph.png

                            Ich weiß, es gibt da RRD etc... Aber mir wird da irgendwie zuviel konsolidiert, und ich hab keinen SQL-Zugriff. Deshalb die Idee die Daten in einer SQL-Datenbank zu schreiben und dann mit einer einfachen API (hab ich bereits bei meinen Eltern schon entwickelt) zugreifbar zu machen, so dass eine nette Kurve dabei raus kommt, die man ggf. in der CV anzeigen kann.

                            Mal schauen wie's weiter geht.

                            Kommentar


                              #74
                              Wieder zurück zum Monolog-Modus ;-)

                              Bin gerade auf ein interessantes Problem gestoßen:

                              Ich habe eine Logik die einen VOC Sensor via USB liest und den Wert auf eine GA schreibt.
                              In der CV habe ich eine Anzeige des Wertes eingerichtet.

                              Im ETS Gruppenmonitor habe ich die Updates der VOC-Logik gesehen. Passt also. Daten kommen auf dem Bus an.
                              Aber wieso zeigt die Visu nix an?

                              Ganz einfach: Wenn Calimero Daten auf den Bus schickt, dann löst das in der eigenen Instanz wohl kein "write"-Event aus. "Man hat das die Aktion ja selbst losgetreten, wozu dann nochmal ein Event dafür bekommen?"

                              Damit könnte man aber schöne Endlosketten bauen... Calimero verhindert das durch dieses Vorgehen konsequent. Wenn ich das jetzt umgehe, dann ist dieses Sicherheitsfeature natürlich aufgeweicht.

                              Mal schauen wie ich das löse.

                              Kommentar


                                #75
                                Hallo Alex,

                                habe nun mal endlich meine ETS3-Datenbank nach .knxproj konvertiert, Einlesen klappt anscheinend trotz der Fehlermeldung
                                Code:
                                2015-10-23 10:11:02.281 WARNING [main] de.root1.kad.logicplugin.Utils.readKnxProjectData: Error while reading file data
                                java.lang.NullPointerException
                                        at javax.xml.bind.WhiteSpaceProcessor.trim(Unknown Source)
                                        at javax.xml.bind.DatatypeConverterImpl._parseDateTime(Unknown Source)
                                        at javax.xml.bind.DatatypeConverterImpl.parseDateTime(Unknown Source)
                                        at javax.xml.bind.DatatypeConverter.parseDateTime(Unknown Source)
                                        at de.root1.ets4reader.Project.<init>(Project.java:75)
                                        at de.root1.ets4reader.KnxProjReader.readProjects(KnxProjReader.java:191)
                                        at de.root1.ets4reader.KnxProjReader.<init>(KnxProjReader.java:70)
                                        at de.root1.kad.logicplugin.Utils.readKnxProjectData(Utils.java:108)
                                        at de.root1.kad.logicplugin.LogicPlugin.start(LogicPlugin.java:60)
                                        at ro.fortsoft.pf4j.DefaultPluginManager.startPlugins(DefaultPluginManager.java:226)
                                        at de.root1.kad.KadMain.<init>(KadMain.java:68)
                                        at de.root1.kad.KadMain.main(KadMain.java:84)
                                OK, funktioniert bei mir. Wie werden langfristig User und Passwort konfiguriert? Vermutlich auch in einer .conf, oder?


                                Sehe ich es richtig, dass du direkt die GAs in der Logik verwendest (in smarthome.py werden sie ja abstrahiert)? Das hat Vor- und Nachteile: einfacher zu konfigurieren (.knxproj direkt einlesen ist schon toll), aber beim Einbinden von Nicht-KNX-Devices (z.B. EnOcean) schwieriger.

                                Weitere Rückmeldung dann, wenn ich auch wieder Zugriff auf den Bus habe, kann also ein bisschen dauern (hoffentlich nicht wieder 2 Wochen).

                                Max

                                Kommentar

                                Lädt...
                                X