+ Antworten
Seite 3 von 15 ErsteErste 1 2 3 4 5 13 ... LetzteLetzte
Ergebnis 21 bis 30 von 146
  1. #21
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,530

    Zitat Zitat von Nall chan Beitrag anzeigen
    Du umgehst das ganze aktuell mit deinen Public Methoden
    Und genau deshalb gibt es auch einen Splitter, weil Du das gefragt hattest. Public Funktionen sind nämlich auch vom User in der Console aufrufbar, was nicht ideal ist das musst Du dann zumindest mit Exceptions abfangen, außerdem sollten solche Funktion an sich nicht für den Nutzer sichtbar sein. Aber dafür ist wie gesagt der Datenaustausch da. In sofern ist das HUE Modul von traxanos, auch wenn dies super funktioniert, vielleicht nicht das passende Beispiel für den Datenaustausch in IP-Symcon, da würde ich eher mal in Module von nall chan schauen der macht das sauber über den Datenaustausch.

  2. #22

    Zitat Zitat von Nall chan Beitrag anzeigen
    Das ist doch Quark, und hatte ich traxanos auch schon Mal geschrieben.
    Dafür ist der Datenaustausch gedacht:
    Datenfluss — IP-Symcon :: Automatisierungssoftware

    Du umgehst das ganze aktuell mit deinen Public Methoden

    Oder ist diese Funktion für einen Timer?
    Habe mir den Code jetzt nicht angesehen...
    Michael
    Das mit dem Datenfluss hab ich immer noch nicht so verstanden .... und ich hab beruflich schon ne Menge an Kommunikationstreibern geschrieben.
    In meinem Modul wird durch einen Timer zyklisch die Methode HP_SyncStates($bridgeId) aufgerufen.
    Dieses SyncStates macht eine allgemeine Datenanfrage an den Homepiloten, der dann mit einem Array von Objekten Antwortet. Pro Aktor/Sensor ein Objekt.
    Die Methode SyncStates sucht dann für jedes Objekt eine Symcon Instanz und übergibt wenn gefunden das Objekt an die Instanz via HP_ApplyData/HPSensor_ApplyData. Die kümmert sich dann um die Zuordnung an die einzelnen Variablen.


    Aber was ist mit der Deklaration der RequestAction Methode??
    Wieso in der doku erst mit string deklariert und dann im Beispiel ohne? Das ist doch nicht stringent oder?

  3. #23
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,530

    Zitat Zitat von BrunoM Beitrag anzeigen
    Das mit dem Datenfluss hab ich immer noch nicht so verstanden ....
    Schau Dir doch mal meine Beta Vorlage an da ist alles drinnen auch ein Splitter das kannst Du 1:1 übernehmen. Kopierst Dir einfach die module.json mit den GUIDs und die Funktionen innerhalb der Instanzen. Dann hast Du schon einen funktionieren Datenfluss ohne public Funktionen. Aktualisierung hatte ich nicht drinnen aber da kann man ja selber ein Event anlegen bzw. Du legst vom Modul eins an.
    Die Funktion SyncStates bekommt die Daten -> Weiterleitung an den Splitter. Der macht gegeben falls noch was mit den Daten und reicht diese dann an die Instanz. Diese nimmt die dann mit
    public function ReceiveData($JSONString)
    entgegen und dann kannst Du in der Instanz die Daten abspeichern.
    Geändert von Fonzo (05.03.17 um 13:32 Uhr)

  4. #24
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,530

    Zitat Zitat von BrunoM Beitrag anzeigen
    Aber was ist mit der Deklaration der RequestAction Methode??
    Wieso in der doku erst mit string deklariert und dann im Beispiel ohne? Das ist doch nicht stringent oder?
    Da gebe ich Dir recht das kann aber wohl nur Paresy beantworten.

  5. #25

    Zitat Zitat von Fonzo Beitrag anzeigen
    Die Funktion SyncStates bekommt die Daten -> Weiterleitung an den Splitter. Der macht gegebenfalls noch was mit den Daten und reicht diese dann an die Instanz. Diese nimmt die dann mit
    public function ReceiveData($JSONString)
    entgegen und dann kannst Du in der Instanz die Daten abspeichern.
    Na ja .... die Bridge bekommt die Daten als JSON Antwort. Die muss überprüft und dekodiert werden bevor sie an Splitter/Instanzen weitergereicht werden kann.
    D.h. ich müsste das dekodierte Objekt wieder in JSON wandeln an den Splitter weiterreichen der es dann wieder decodiert ....
    Klingt für mich nach unnötiger Verschwendung von Performance.

    Ich könnte die ApplyData Funktion auch in die Bridge verlagern und dann für den Zugriff auf die Instanzen nur auf öffentliche Funktionen zurückgreifen.
    Ich werde mal sehen wie ich das public / protected Problem in den Griff bekomme. In C++ wäre das alles kein problem

  6. #26
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,530

    Zitat Zitat von BrunoM Beitrag anzeigen
    D.h. ich müsste das dekodierte Objekt wieder in JSON wandeln an den Splitter weiterreichen der es dann wieder decodiert ....
    Klingt für mich nach unnötiger Verschwendung von Performance.
    Ja das mag sein aber so wäre es sauber. Und Du gibst ja nur das als JSON weiter was Du auch brauchst den Rest kannst Du gleich verwerfen. Auf der anderen Seite verweist Du ja auch auf die Dokumentation. Außerdem kannst Du dann auch die weiteren dokumentierten Funktionen nutzten wie
    senddebug
    damit ist es dann sowohl Dir als auch dem Nutzer möglich so wie in IP-Symcon vorgesehen im Debug Fenster den Datenfluss zu verfolgen und zu sehen was eigentlich genau passiert.

  7. #27

    Zitat Zitat von BrunoM Beitrag anzeigen
    Ich werde mal sehen wie ich das public / protected Problem in den Griff bekomme
    Ich könnte meinen Instanzen z.B. ein public Member spendieren (da hat ja kein Anwender über Befehl testen Zugriff drauf) über den ich von der Bridge aus die zu Verarbeitenden Daten hinterlege bevor ich dann ExtApplyData ohne Parameter aufrufe. Das ExtApplyData könnte dann eine nun protected ApplyData Methode mit Übergabepointer aufrufen. Nach dem Verarbeiten kann ich das Member dann wieder auf nullptr setzen. Ein Aufruf durch den Benutzer würde dann einfach ins leere Laufen da das zu verarbeitende Objekt ja null ist.

    Gute Idee?

  8. #28

    Ich glaube das ist keine gute Idee..... ist halt kein C++
    Aber ein Splitter verkompliziert in meinen Augen das ganze Handling der Daten.
    Als Kompromiss könnte ich $data in der Bridge in einen string wandeln und in der Instanz wieder zurückwandeln.
    Das macht meinen Code nicht komplizierter und IP-Symcon ist glücklich

  9. #29
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    9,192

    Zitat Zitat von BrunoM Beitrag anzeigen
    Na ja .... die Bridge bekommt die Daten als JSON Antwort. Die muss überprüft und dekodiert werden bevor sie an Splitter/Instanzen weitergereicht werden kann.
    D.h. ich müsste das dekodierte Objekt wieder in JSON wandeln an den Splitter weiterreichen der es dann wieder decodiert ....
    Klingt für mich nach unnötiger Verschwendung von Performance.
    Du verschwedest aber selber viel mehr, weil du das hier machst:

    Zitat Zitat von BrunoM Beitrag anzeigen
    Die Methode SyncStates sucht dann für jedes Objekt eine Symcon Instanz und übergibt wenn gefunden das Objekt an die Instanz via HP_ApplyData/HPSensor_ApplyData. Die kümmert sich dann um die Zuordnung an die einzelnen Variablen.
    Beim Datenaustausch kümmert sich IPS um die Weitergabe der Daten an die Korrekten Instanzen.
    Vorausgesetzt man setzt einen ReceiveFilter ist IPS zig mal schneller als du in PHP

    Ich nutzt z.B. bei dem HMExtended-Modul einen Splitter welcher ebenfalls per Timer Daten holt.
    Das JSON enthält ebenfalls mehrere Geräte und wird somit einmal pro Geräte aufgeteilt.
    Das ganze dann einfach mit SendDataToChildren weitersenden und fertig.

    Die Geräte-Instanzen setzten einen Filter (SetReceiveDataFilter) und erhalten somit automatisch nur Ihre Daten in der Methode ReceiveData.

    Schau es dir einfach mal an, es ist einfacher und übersichtlicher als man glaubt

    Michael

    Quelle: IPSHomematicExtended/module.php at master · Nall-chan/IPSHomematicExtended · GitHub
    Splitter:
    PHP-Code:
            $Result $this->GetInterfaces(); // Liefert ein Objekt stdClass 
            
    foreach ($Result as $ProtocolID => $Protocol)
            {
                if (!
    is_array($Protocol)) // Skip empty Protocol
                    
    continue;
                foreach (
    $Protocol as $InterfaceIndex => $Interface)
                {
                    
    $this->SendDebug("Proto" $ProtocolID " If" $InterfaceIndex$Interface0);
                    
    $Interface->DataID "{E2966A08-BCE1-4E76-8C4B-7E0136244E1B}";
                    
    $Data json_encode($Interface);
                    
    $this->SendDataToChildren($Data);
                }
            } 
    IPSHomematicExtended/module.php at master · Nall-chan/IPSHomematicExtended · GitHub
    Device
    PHP-Code:
        public function ApplyChanges()
        {
            
    parent::ApplyChanges();
            
    $Address $this->ReadPropertyString("Address");
            
    $this->SetSummary($Address);
            if (
    $Address !== "")
                
    $this->SetReceiveDataFilter('.*"ADDRESS":"' $Address '".*'); // Set filter for ReceiveData
            
    else
                
    $this->SetReceiveDataFilter(".*9999999999.*"); // bail out all data
        
    }

        public function 
    ReceiveData($JSONString)
        {
            
    $Data json_decode($JSONString);
            unset(
    $Data->DataID); 
            unset(
    $Data->ADDRESS);
            
    $this->SendDebug('Receive'$Data0);
            foreach (
    $Data as $Ident => $Value)
            {
                if (
    $Value === ""// skip empty value
                    
    continue;

                
    $Profil "";

                if (
    $Ident == "DUTY_CYCLE")
                    
    $Profil "~Intensity.100";

                switch (
    gettype($Value))
                {
                    case 
    "boolean":
                        
    $Typ vtBoolean;
                        break;
                    case 
    "integer":
                        
    $Typ vtInteger;
                        break;
                    case 
    "double":
                    case 
    "float":
                        
    $Typ vtFloat;
                        break;
                    case 
    "string":
                        
    $Typ vtString;
                        break;
                    default:
                        continue; 
    // skip child objects
                
    }

                
    $vid = @$this->GetIDForIdent($Ident);
                if (
    $vid === false)
                {
                    
    $this->MaintainVariable($Ident$Ident$Typ$Profil0true);
                    
    $vid = @$this->GetIDForIdent($Ident);
                }
                
    SetValue($vid$Value);
            }
        } 
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  10. #30
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    9,192

    Zitat Zitat von BrunoM Beitrag anzeigen
    Aber ein Splitter verkompliziert in meinen Augen das ganze Handling der Daten.
    Was ist den die 'Bridge' aktuell für ein Typ von Instanz, ein IO ?
    Ist ja egal, der kann genauso funktionieren. Völlig egal ob Splitter oder IO.
    Zusätzlich brauchst du eigentlich keinen.

    Außer du hängst noch unter einem echten IO bestehend aus z.B. ClientSocket oder SerialPort. Dann wäre dein Typ von Instanz auf jedenfall Splitter.

    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

Ähnliche Themen

  1. Rademacher Homepilot
    Von otrload im Forum Haustechnik
    Antworten: 83
    Letzter Beitrag: 18.08.18, 20:46
  2. Rademacher Homepilot 1 und sein Hitzeproblem
    Von wolkensurfer im Forum Bastel-Ecke
    Antworten: 1
    Letzter Beitrag: 04.02.17, 14:42
  3. IO Modul (Funk oder Ethernet)
    Von Sascha im Forum Bastel-Ecke
    Antworten: 11
    Letzter Beitrag: 12.01.16, 11:47
  4. Frage oder Idee zu calendar Modul
    Von gremlin36 im Forum IP-Symcon WIIPS
    Antworten: 5
    Letzter Beitrag: 27.05.08, 16:38
  5. Rademacher Fernotron mit IPS steuern
    Von TK6 im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 1
    Letzter Beitrag: 30.01.07, 10:00