Ankündigung

Einklappen
Keine Ankündigung bisher.

Zugriff auf SmartHomeNG Websocket IF aus Android

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

    Zugriff auf SmartHomeNG Websocket IF aus Android

    Hallo,

    um meine alte REST Schnittstelle abzulösen, bin ich gerade dabei, eine Android-Implementierung gegen das Websocket-IF zu schreiben.

    Zur Vorwarnung: der Code der gleich kommt ist nur ein roher Proof of Concept, keine Anleitung, keine Referenzimplementierung oder gar eine "Pre Alpha". Wenn es einen Buchstaben vor dem Alpha gäbe, wäre es vielleicht das

    Aktueller Stand: Die Klasse SmartHomeNGConnector die die Websocket-Verbindung handelt und Items aufnimmt, die dann geupdated (gemonitored) werden. Das geht soweit schon auch... Der Weg bis zur GUI fehlt aber noch, hier könnte ich Rat gebrauchen.

    In meiner Application Klasse starte ich das Ding mit
    Code:
    this.smartHomeNGConnector = new SmartHomeNGConnector("ws://"+hostIdentifier+":2424/");
    In der Activity selber mache ich nur noch im onCreate bspw. ein:
    Code:
    app = (HomeMonitorApplication) getApplication();
    [...]
    
    waterPump = new Item("outside.pump");
    garageGate = new Item("outside.gate.garage");
    officeLight = new Item("office.light");
    app.getSmartHomeNGConnector().addMonitoredItem(waterPump);
    app.getSmartHomeNGConnector().addMonitoredItem(garageGate);
    app.getSmartHomeNGConnector().addMonitoredItem(officeLight);
    app.getSmartHomeNGConnector().monitor();
    Problem ist jetzt, wie ich dynamisch die GUI in der Activity am besten updaten kann. Früher hatte ich irgendwie alles auf IntentServices usw gebaut, hatte aber auch kein live Update.. Vielleicht gibt es ja Android-versierte Mitstreiter hier..


    Anbei noch die Klasse für die Websocket-Verbindung:

    Code:
    package xxx.xxx.xxx.services;
    
    import android.app.IntentService;
    import android.app.Service;
    import android.util.Log;
    
    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.drafts.Draft_17;
    import org.java_websocket.handshake.ServerHandshake;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.ArrayList;
    import java.util.List;
    
    import xxx.xxx.xxx.data.Item;
    
    public class SmartHomeNGConnector {
    
        private WebSocketClient mWebSocketClient;
        List<Item> monitoredItems;
        private URI uri;
    
        public SmartHomeNGConnector(String uri) {
            try {
                this.uri = new URI(uri);
            } catch (URISyntaxException e) {
                e.printStackTrace();
                return;
            }
            this.clearMonitoredItems();
            this.connectWebSocket();
        }
    
        public void connectWebSocket() {
            this.mWebSocketClient = new WebSocketClient(this.getUri(), new Draft_17()) {
                @Override
                public void onOpen(ServerHandshake serverHandshake) {
                    Log.i("WebSocket", "Opened");
                }
    
                @Override
                public void onMessage(String s) {
                    final String message = s;
                    Log.i("WebSocket", "SmartHomeNGConnector receiving data: "+s);
                    try {
                        JSONObject jObject  = new JSONObject(s); // json
                        String cmd = jObject.getString("cmd");
                        Log.i("WebSocket", "CMD: "+cmd);
                        if (cmd.equals("item") && jObject.has("items")) {
                            JSONArray items = jObject.getJSONArray("items"); // get data object
                            for (int i = 0; i < items.length(); i++) {
                                JSONArray item = items.getJSONArray(i);
                                if (item.length() == 2) {
                                    String itemPath = item.getString(0);
                                    String value = item.getString(1);
                                    findMonitoredItem(itemPath).setValue(value);
                                    Log.i("WebSocket", "Item set: "+itemPath + " " + value);
                                }
                            }
                        }
    
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onClose(int i, String s, boolean b) {
                    Log.i("WebSocket", "Closed " + s);
                }
    
                @Override
                public void onError(Exception e) {
                    Log.i("WebSocket", "Error " + e.getMessage());
                }
            };
    
            this.mWebSocketClient.connect();
        }
    
        public void monitor() {
            if (this.monitoredItems.size() > 0) {
                String listString = "";
                for (int i = 0; i < this.monitoredItems.size(); i++) {
                    listString += this.monitoredItems.get(i).getItemPath();
                    if (i < this.monitoredItems.size()-1) {
                        listString += ",";
                    }
                    Log.i("WebSocket", this.monitoredItems.get(i).getItemPath());
                }
                // items
                Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"monitor\", \"items\": \""+listString+"\"}");
                this.mWebSocketClient.send("{\"cmd\":\"monitor\", \"items\": \""+listString+"\"}");
                Log.i("WebSocket", "SmartHomeNGConnector data sent!");
            }
        }
    
        /**
         * Does a write-request to an itempath with a value
         */
        public void write(String itempath, String value) {
            Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}");
            this.mWebSocketClient.send("{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}");
            Log.i("WebSocket", "SmartHomeNGConnector data sent!");
        }
    
        /**
         * Does a write-request to an itempath with a value
         */
        public void write(String itempath, int value) {
            Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}");
            this.mWebSocketClient.send("{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}");
            Log.i("WebSocket", "SmartHomeNGConnector data sent!");
        }
    
        /**
         * Triggers a logic
         */
        public void trigger(String name, String value) {
            this.mWebSocketClient.send("{\"cmd\":\"item\" , \"'name'\":\"" + name + "\" , \"val\":" + value + "}");
        }
    
        /**
         * Triggers a logic
         */
        public void trigger(String name, int value) {
            this.mWebSocketClient.send("{\"cmd\":\"item\" , \"'name'\":\"" + name + "\" , \"val\":" + value + "}");
        }
    
        public URI getUri() {
            return this.uri;
        }
    
        public List<Item> getMonitoredItems() {
            return this.monitoredItems;
        }
    
        public void clearMonitoredItems() {
            this.monitoredItems = new ArrayList<Item>();
        }
    
        public Item findMonitoredItem(String itemPath) {
            for (int i = 0; i < this.monitoredItems.size(); i++) {
                if (this.monitoredItems.get(i).getItemPath().equals(itemPath)) {
                    return this.monitoredItems.get(i);
                }
            }
            return null;
        }
    
        public void addMonitoredItem(Item item) {
            if (this.findMonitoredItem(item.getItemPath())==null) {
                this.monitoredItems.add(item);
            }
        }
    }
    Zuletzt geändert von psilo; 19.08.2016, 12:46.
Lädt...
X