瀏覽代碼

Connector Theros

Lukas Cerny 1 年之前
父節點
當前提交
950da31a25

+ 11 - 0
README.md

@@ -54,6 +54,17 @@ $ docker compose up
 $ docker compose up <service>          // e.g. demoLogger
 ```
 
+To export docker image
+```shell
+$ docker save <image_name> > name.tar
+$ docker save connector-period-senslogtelemetry2theros > connector_telemetry2theros.tar
+```
+
+To run docker image
+```shell
+docker run --name <container_name> -d --ulimit nofile=122880:122880 -e APP_PARAMS="-cf config/<config_name>.yaml" <image_name>
+docker run --name senslog_connector_senslog2analytics -d --ulimit nofile=122880:122880 -e APP_PARAMS="-cf config/senslog1Analytics.yaml" connector-period-senslog2analytics
+```
 
 ## Java & Maven
 The application supports **Java 8+** and uses **Maven** as a build automation tool. Configuration for Maven contains

+ 14 - 7
config/senslogTelemetryTheros.yaml

@@ -2,15 +2,22 @@
 settings:
     - Telemetry:
         name: "SensLog Telemetry"
-        provider: "cz.senslog.fetch.senslog.telemetry.ConnectorFetchSenslogTelemetryProvider"
+        provider: "cz.senslog.connector.fetch.senslog.telemetry.ConnectorFetchSenslogTelemetryProvider"
 
         baseUrl: "https://theros.wirelessinfo.cz/"
         bearerToken: "#123"
 
-        startAt: "2023-08-25T00:00:00+00:00"
-        interval: 4    # hours
-        campaignId: 2
-        limit: 10
+        startAt: "now" # "2024-12-01T11:00:00+00:00"
+        interval: 1    # hours
+        limit: 100
+
+        campaignId: 4   # SumavaProduct testing campaign
+        actionId: 1     # DELIVERY
+        entityId: 1     # SUMAVA
+        allowedStations: # units
+            - 1305167563014004
+            - 1305167562660700
+
 
     - Theros:
         name: "Theros"
@@ -28,6 +35,6 @@ connectors:
     - TelemetryTheros:
         fetcher: "Telemetry"
         pusher: "Theros"
-        period: 5 # 86_400 # 24h
+        period: 900 # 300 = 5min 86_400 # 24h
 #        startAt: "02:30:00" # hh:mm:ss
-        initDelay: 5
+        initDelay: 900

+ 2 - 6
connector-fetch-senslog-telemetry/src/main/java/cz/senslog/connector/fetch/senslog/telemetry/ConnectorFetchSenslogTelemetryProvider.java

@@ -1,4 +1,4 @@
-package cz.senslog.fetch.senslog.telemetry;
+package cz.senslog.connector.fetch.senslog.telemetry;
 
 import cz.senslog.connector.fetch.api.ExecutableFetcher;
 import cz.senslog.connector.model.api.GeoJsonModel;
@@ -15,17 +15,13 @@ public class ConnectorFetchSenslogTelemetryProvider implements cz.senslog.connec
     public ExecutableFetcher<GeoJsonModel> createExecutableFetcher(DefaultConfig defaultConfig) {
         logger.info("Initialization a new fetch provider {}.", ConnectorFetchSenslogTelemetryProvider.class.getSimpleName());
 
-        logger.debug("Creating a new configuration.");
         SensLogTelemetryConfig config = new SensLogTelemetryConfig(defaultConfig);
         logger.info("Configuration for {} was created successfully.", SensLogTelemetryFetcher.class.getSimpleName());
 
-
-        logger.debug("Creating a new instance of {}.", SensLogTelemetryFetcher.class);
         SensLogTelemetryFetcher fetcher = new SensLogTelemetryFetcher(config, HttpClient.newHttpSSLClient());
         logger.info("Fetcher for {} was created successfully.", SensLogTelemetryFetcher.class.getSimpleName());
 
-        logger.debug("Creating a new instance of {}.", SensLogTelemetryProxySession.class);
-        ExecutableFetcher<GeoJsonModel> executor = ExecutableFetcher.createWithProxySession(new SensLogTelemetryProxySession(fetcher));
+        ExecutableFetcher<GeoJsonModel> executor = ExecutableFetcher.create(fetcher);
         logger.info("Fetcher executor for {} was created successfully.", SensLogTelemetryFetcher.class.getSimpleName());
 
         return executor;

+ 29 - 0
connector-fetch-senslog-telemetry/src/main/java/cz/senslog/connector/fetch/senslog/telemetry/EventInfo.java

@@ -0,0 +1,29 @@
+package cz.senslog.connector.fetch.senslog.telemetry;
+
+import java.time.OffsetDateTime;
+import java.util.Objects;
+
+public final class EventInfo {
+
+    public enum EventStatus {
+        ONGOING, FINISHED
+    }
+
+    long id;
+    long orderId;
+    EventStatus status;
+    OffsetDateTime fromTime, toTime;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        EventInfo eventInfo = (EventInfo) o;
+        return id == eventInfo.id;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(id);
+    }
+}

+ 15 - 1
connector-fetch-senslog-telemetry/src/main/java/cz/senslog/connector/fetch/senslog/telemetry/SensLogTelemetryConfig.java

@@ -1,4 +1,4 @@
-package cz.senslog.fetch.senslog.telemetry;
+package cz.senslog.connector.fetch.senslog.telemetry;
 
 import cz.senslog.connector.model.config.DefaultConfig;
 
@@ -11,7 +11,11 @@ public class SensLogTelemetryConfig {
     private final String baseUrl;
     private final String bearerToken;
     private final LocalDateTime startAt;
+
     private final int campaignId;
+    private final int entityId;
+    private final int actionId;
+
     private final int limit;
     private final int interval;
     private final Set<Long> allowedStations;
@@ -27,6 +31,8 @@ public class SensLogTelemetryConfig {
             this.startAt = null;
         }
         this.campaignId = defaultConfig.getIntegerProperty("campaignId");
+        this.entityId = defaultConfig.getIntegerProperty("entityId");
+        this.actionId = defaultConfig.getIntegerProperty("actionId");
         this.limit = defaultConfig.getIntegerProperty("limit");
         this.interval = defaultConfig.getIntegerProperty("interval");
         if (defaultConfig.containsProperty("allowedStations")) {
@@ -56,6 +62,14 @@ public class SensLogTelemetryConfig {
         return campaignId;
     }
 
+    public int getEntityId() {
+        return entityId;
+    }
+
+    public int getActionId() {
+        return actionId;
+    }
+
     public int getInterval() {
         return interval;
     }

+ 146 - 70
connector-fetch-senslog-telemetry/src/main/java/cz/senslog/connector/fetch/senslog/telemetry/SensLogTelemetryFetcher.java

@@ -1,9 +1,11 @@
-package cz.senslog.fetch.senslog.telemetry;
+package cz.senslog.connector.fetch.senslog.telemetry;
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
 import cz.senslog.connector.fetch.api.ConnectorFetcher;
 import cz.senslog.connector.model.api.GeoJsonModel;
+import cz.senslog.connector.model.api.VoidSession;
 import cz.senslog.connector.tools.http.HttpClient;
 import cz.senslog.connector.tools.http.HttpRequest;
 import cz.senslog.connector.tools.http.HttpResponse;
@@ -12,18 +14,19 @@ import cz.senslog.connector.tools.json.BasicJson;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import java.lang.reflect.Type;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.Optional;
+import java.util.*;
 
 import static cz.senslog.connector.tools.http.HttpContentType.APPLICATION_GEO_JSON;
 import static cz.senslog.connector.tools.http.HttpContentType.APPLICATION_JSON;
 import static cz.senslog.connector.tools.http.HttpHeader.*;
+import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
 
-public class SensLogTelemetryFetcher implements ConnectorFetcher<SensLogTelemetrySession, GeoJsonModel> {
+public class SensLogTelemetryFetcher implements ConnectorFetcher<VoidSession, GeoJsonModel> {
 
     private static final Logger logger = LogManager.getLogger(SensLogTelemetryFetcher.class);
 
@@ -33,11 +36,16 @@ public class SensLogTelemetryFetcher implements ConnectorFetcher<SensLogTelemetr
         OffsetDateTime fromTime, toTime;
     }
 
+    private static final ZoneOffset DEFAULT_TIME_OFFSET = ZoneOffset.UTC;
+
     private final SensLogTelemetryConfig config;
 
     private final HttpClient httpClient;
 
-    private CampaignInfo campaignInfo;
+    private OffsetDateTime startFrom;
+
+    private final Map<Long, SensLogTelemetrySession> multiEventSession;
+
 
     public SensLogTelemetryFetcher() {
         this(null, null);
@@ -46,12 +54,16 @@ public class SensLogTelemetryFetcher implements ConnectorFetcher<SensLogTelemetr
     public SensLogTelemetryFetcher(SensLogTelemetryConfig config, HttpClient httpClient) {
         this.config = config;
         this.httpClient = httpClient;
+        this.multiEventSession = new HashMap<>();
     }
 
     @Override
     public void init() throws Exception {
         assert config != null; assert httpClient != null;
 
+        startFrom = config.getStartAt().atOffset(DEFAULT_TIME_OFFSET);
+
+        /*
         HttpRequest request = HttpRequest.newBuilder().GET()
                 .url(URLBuilder.newBuilder(config.getBaseUrl(), String.format("campaigns/%d", config.getCampaignId()))
                         .addParam("zone", "UTC")
@@ -73,58 +85,100 @@ public class SensLogTelemetryFetcher implements ConnectorFetcher<SensLogTelemetr
         }
 
         logger.info("Initialized fetching telemetries from the campaign '{}'", campaignInfo.name);
+        */
+
     }
 
     @Override
-    public GeoJsonModel fetch(Optional<SensLogTelemetrySession> sessionOpt) {
-
-        final OffsetDateTime now = OffsetDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
-
-        SensLogTelemetrySession session = sessionOpt.orElse(null);
-        assert session != null;
-
-        if (session.hasNotNext()) {
-            if (session.getFromTime() == null) {
-                if (config.getStartAt() != null) {
-                    session.setFromTime(OffsetDateTime.of(config.getStartAt(), ZoneOffset.UTC));
+    public GeoJsonModel fetch(Optional<VoidSession> sessionOpt) {
+
+        final OffsetDateTime now = OffsetDateTime.ofInstant(Instant.now(), DEFAULT_TIME_OFFSET);
+        {
+            for (long unitId : config.getAllowedStations()) {
+                logger.info("Events for Unit {} from {}.", unitId, startFrom.format(ISO_OFFSET_DATE_TIME));
+                HttpRequest request = HttpRequest.newBuilder().GET()
+                        .url(URLBuilder.newBuilder(config.getBaseUrl(), String.format("/entities/%d/units/%d/actions/%d/events",
+                                        config.getEntityId(), unitId, config.getActionId()))
+                                .addParam("from", startFrom.format(ISO_OFFSET_DATE_TIME))
+                                .addParam("zone", "UTC")
+                                .addParam("navigationLinks", "false")
+                                .build())
+                        .header(ACCEPT, APPLICATION_JSON)
+                        .header(AUTHORIZATION, "Bearer " + config.getBearerToken())
+                        .build();
+
+                HttpResponse response = httpClient.send(request);
+
+                if (response.isOk()) {
+                    Type eventInfoListType = new TypeToken<Collection<EventInfo>>(){}.getType();
+                    List<EventInfo> eventInfoList = BasicJson.jsonToObject(response.getBody(), eventInfoListType);
+                    for (EventInfo eventInfo : eventInfoList) {
+                        if (multiEventSession.containsKey(eventInfo.id)) {
+                            EventInfo sessionEvent = multiEventSession.get(eventInfo.id).getEventInfo();
+                            sessionEvent.fromTime = eventInfo.fromTime;
+                            sessionEvent.toTime = eventInfo.toTime;
+                            sessionEvent.status = eventInfo.status;
+                        } else {
+                            logger.info("Events for Unit {} from {}.", unitId, startFrom.format(ISO_OFFSET_DATE_TIME));
+                            HttpResponse orderStatusRes = httpClient.send(HttpRequest.newBuilder().GET()
+                                    .url(URLBuilder.newBuilder(config.getBaseUrl(), "/integration/tracking/status")
+                                            .addParam("unit_id", unitId)
+                                            .build())
+                                    .header(ACCEPT, APPLICATION_JSON)
+                                    .header(AUTHORIZATION, "Bearer " + config.getBearerToken())
+                                    .build());
+
+                            if (orderStatusRes.isOk()) {
+                                Map<?, ?> orderStatusMap = BasicJson.jsonToObject(orderStatusRes.getBody(), Map.class);
+                                if (orderStatusMap.containsKey("orderId")) {
+                                    eventInfo.orderId = ((Double) orderStatusMap.get("orderId")).longValue();
+                                    multiEventSession.put(eventInfo.id, new SensLogTelemetrySession(eventInfo, startFrom, config.getInterval()));
+                                }
+                            } else {
+                                logger.error(orderStatusRes.getBody());
+                            }
+                        }
+                    }
                 } else {
-                    session.setFromTime(campaignInfo.fromTime);
+                    logger.error(response.getBody());
                 }
-                session.setToTime(session.getFromTime().plusHours(config.getInterval()));
             }
+        }
+        startFrom = now;
 
-            if (session.getToTime().isAfter(now)) {
-                logger.info("To early for the new data, the next interval is in {} minutes.", Duration.between(now, session.getToTime()).toMinutes());
-                return GeoJsonModel.empty();
-            }
+        if (multiEventSession.isEmpty()) {
+            return GeoJsonModel.empty();
         }
 
-        HttpRequest request;
-        if (config.getAllowedStations().isEmpty()) {
+        JsonArray featureCollections = new JsonArray();
+        OffsetDateTime globalTimestampFirst = OffsetDateTime.MAX;
+        OffsetDateTime globalTimestampLast = OffsetDateTime.MIN;
 
-            request = HttpRequest.newBuilder().GET()
-                    .url(URLBuilder.newBuilder(config.getBaseUrl(), String.format("campaigns/%d/units/observations", config.getCampaignId()))
-                            .addParam("limit", config.getLimit())
-                            .addParam("format", "geojson")
-                            .addParam("from", session.getFromTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
-                            .addParam("to", session.getToTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
-                            .addParam("zone", "UTC")
-                            .addParam("offset", session.getOffset())
-                            .addParam("navigationLinks", "false")
-                            .build())
-                    .header(ACCEPT, APPLICATION_GEO_JSON)
-                    .header(AUTHORIZATION, "Bearer " + config.getBearerToken())
-                    .build();
-        } else {
+        for (SensLogTelemetrySession session : multiEventSession.values()) {
+            EventInfo event = session.getEventInfo();
+
+            if (session.hasNotNext()) {
+                if (session.getEventInfo().toTime != null) {
+                    session.setToTime(session.getEventInfo().toTime);
+                } else if (session.getToTime().isAfter(now)) {
+                    session.setToTime(now);
+                }
 
-            long unitId = config.getAllowedStations().iterator().next();
+//                if (session.getToTime().isAfter(now)) {
+//                    logger.info("To early for the new data, the next interval is in {} minutes.", Duration.between(now, session.getToTime()).toMinutes());
+//                    return GeoJsonModel.empty();
+//                }
+            }
 
-            request = HttpRequest.newBuilder().GET()
-                    .url(URLBuilder.newBuilder(config.getBaseUrl(), String.format("campaigns/%d/units/%d/observations", config.getCampaignId(), unitId))
+            String fromParam = session.getFromTime().format(ISO_OFFSET_DATE_TIME);
+            String toParam = session.getToTime().format(ISO_OFFSET_DATE_TIME);
+            logger.info("Getting observations within: {} - {}.", fromParam, toParam);
+            HttpRequest request = HttpRequest.newBuilder().GET()
+                    .url(URLBuilder.newBuilder(config.getBaseUrl(), String.format("/events/%d/observations", event.id))
                             .addParam("limit", config.getLimit())
                             .addParam("format", "geojson")
-                            .addParam("from", session.getFromTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
-                            .addParam("to", session.getToTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
+                            .addParam("from", fromParam)
+                            .addParam("to", toParam)
                             .addParam("zone", "UTC")
                             .addParam("offset", session.getOffset())
                             .addParam("navigationLinks", "false")
@@ -132,42 +186,64 @@ public class SensLogTelemetryFetcher implements ConnectorFetcher<SensLogTelemetr
                     .header(ACCEPT, APPLICATION_GEO_JSON)
                     .header(AUTHORIZATION, "Bearer " + config.getBearerToken())
                     .build();
-        }
 
-        HttpResponse response = httpClient.send(request);
+            HttpResponse response = httpClient.send(request);
 
-        if (response.isError()) {
-            logger.error(response.getBody());
-            return GeoJsonModel.empty();
-        }
+            if (response.isError()) {
+                logger.error(response.getBody());
+                continue;
+            }
 
-        JsonObject geoJson = BasicJson.jsonToObject(response.getBody(), JsonObject.class);
+            JsonObject geoJson = BasicJson.jsonToObject(response.getBody(), JsonObject.class);
 
-        JsonObject metadata = geoJson.remove("metadata").getAsJsonObject();
-        int geoSize = metadata.get("size").getAsInt();
-        session.setOffset(geoSize);
-        session.hasNext(metadata.get("hasNext").getAsBoolean());
+            JsonObject metadata = geoJson.getAsJsonObject("metadata");
+            int geoSize = metadata.get("size").getAsInt();
+            session.setOffset(geoSize);
+            session.hasNext(metadata.get("hasNext").getAsBoolean());
 
-        if (session.hasNotNext()) {
-            session.setFromTime(session.getToTime());
-            session.setToTime(session.getToTime().plusHours(config.getInterval()));
-            session.setOffset(0);
-        }
+            if (session.hasNotNext()) {
+                session.setFromTime(session.getToTime());
+                session.setToTime(session.getToTime().plusHours(config.getInterval()));
+                session.setOffset(0);
+            }
 
-        JsonArray features = geoJson.getAsJsonArray("features");
-        if (features.size() != geoSize) {
-            logger.warn("Retrieved metadata size of features differs to " + geoSize + " from " + features.size());
-            geoSize = features.size();
-        }
+            JsonArray features = geoJson.getAsJsonArray("features");
+            if (features.size() != geoSize) {
+                logger.warn("Retrieved metadata size of features differs to " + geoSize + " from " + features.size());
+                geoSize = features.size();
+            }
 
-        if (geoSize <= 0) {
-            logger.warn("Retrieved zero data within the interval of " + session.getFromTime() + " to " + session.getToTime());
-            return GeoJsonModel.empty();
+            if (geoSize <= 0) {
+                logger.warn("Retrieved zero data within the interval of " + session.getFromTime() + " to " + session.getToTime());
+                return GeoJsonModel.empty();
+            }
+
+            OffsetDateTime locTmFirst = OffsetDateTime.parse(features.get(0).getAsJsonObject().getAsJsonObject("properties").get("timestamp").getAsString());
+            OffsetDateTime locTmLast = OffsetDateTime.parse(features.get(geoSize - 1).getAsJsonObject().getAsJsonObject("properties").get("timestamp").getAsString());
+
+            features.asList().forEach(feature -> feature.getAsJsonObject().get("properties").getAsJsonObject()
+                    .addProperty("orderId", Long.toString(event.orderId))
+            );
+
+            featureCollections.addAll(features);
+            if (locTmFirst.isBefore(globalTimestampFirst)) {
+                globalTimestampFirst = locTmFirst;
+            }
+            if (locTmLast.isAfter(globalTimestampLast)) {
+                globalTimestampLast = locTmLast;
+            }
+
+            if (event.status.equals(EventInfo.EventStatus.FINISHED) && session.hasNotNext()) {
+                multiEventSession.remove(event.id);
+            } else {
+                event.status = EventInfo.EventStatus.FINISHED;
+            }
         }
 
-        OffsetDateTime fTimestampFirst = OffsetDateTime.parse(features.get(0).getAsJsonObject().getAsJsonObject("properties").get("timestamp").getAsString());
-        OffsetDateTime fTimestampLast = OffsetDateTime.parse(features.get(geoSize-1).getAsJsonObject().getAsJsonObject("properties").get("timestamp").getAsString());
+        JsonObject geoJson = new JsonObject();
+        geoJson.addProperty("type", "FeatureCollection");
+        geoJson.add("features", featureCollections);
 
-        return new GeoJsonModel(geoJson, fTimestampFirst, fTimestampLast);
+        return new GeoJsonModel(geoJson, globalTimestampFirst, globalTimestampLast);
     }
 }

+ 11 - 6
connector-fetch-senslog-telemetry/src/main/java/cz/senslog/connector/fetch/senslog/telemetry/SensLogTelemetrySession.java

@@ -1,21 +1,26 @@
-package cz.senslog.fetch.senslog.telemetry;
+package cz.senslog.connector.fetch.senslog.telemetry;
 
 import cz.senslog.connector.model.api.ProxySessionModel;
 
 import java.time.OffsetDateTime;
 
-public class SensLogTelemetrySession extends ProxySessionModel {
+public class SensLogTelemetrySession {
 
+    private final EventInfo eventInfo;
     private OffsetDateTime fromTime, toTime;
     private int offset;
     private boolean hasNext;
 
-    public SensLogTelemetrySession(boolean isActive) {
-        super(isActive);
+    public SensLogTelemetrySession(EventInfo eventInfo, OffsetDateTime fromTime, int interval) {
+        this.eventInfo = eventInfo;
         this.offset = 0;
         this.hasNext = false;
-        this.fromTime = null;
-        this.toTime = null;
+        this.fromTime = fromTime;
+        this.toTime = fromTime.plusHours(interval);
+    }
+
+    public EventInfo getEventInfo() {
+        return eventInfo;
     }
 
     public int getOffset() {

+ 1 - 1
connector-fetch-senslog-telemetry/src/main/resources/META-INF/services/cz.senslog.connector.fetch.api.ConnectorFetchProvider

@@ -1 +1 @@
-cz.senslog.fetch.senslog.telemetry.ConnectorFetchSenslogTelemetryProvider
+cz.senslog.connector.fetch.senslog.telemetry.ConnectorFetchSenslogTelemetryProvider

+ 20 - 10
connector-fetch-senslog-telemetry/src/test/java/cz/senslog/connector/fetch/senslog/telemetry/SensLogTelemetryFetcherTest.java

@@ -1,4 +1,4 @@
-package cz.senslog.fetch.senslog.telemetry;
+package cz.senslog.connector.fetch.senslog.telemetry;
 
 import cz.senslog.connector.fetch.api.ExecutableFetcher;
 import cz.senslog.connector.model.api.GeoJsonModel;
@@ -6,28 +6,38 @@ import cz.senslog.connector.model.config.DefaultConfig;
 import cz.senslog.connector.tools.http.HttpClient;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 
-import static org.junit.jupiter.api.Assertions.*;
-
 class SensLogTelemetryFetcherTest {
 
     @Test
     void onlineTest() throws Exception {
 
         DefaultConfig defaultConfig = new DefaultConfig("", null);
-        defaultConfig.setProperty("baseUrl", "https://theros.wirelessinfo.cz/");
-        defaultConfig.setProperty("startAt", "2024-06-23T20:00:00+00:00");
+//        defaultConfig.setProperty("startAt", "now");
+        defaultConfig.setProperty("startAt", "2024-12-01T10:09:00+00:00"); // 2024-12-01T10:09:34.589Z
         defaultConfig.setProperty("bearerToken", "#123");
+        defaultConfig.setProperty("limit", 100);
+        defaultConfig.setProperty("interval", 1);
+
+//        defaultConfig.setProperty("baseUrl", "http://127.0.0.1:8085");
+//        defaultConfig.setProperty("campaignId", 3);
+//        defaultConfig.setProperty("actionId", 9);
+//        defaultConfig.setProperty("entityId", 3);
+//        defaultConfig.setProperty("allowedStations", Arrays.asList(1000L));
+
+
+        defaultConfig.setProperty("baseUrl", "https://theros.wirelessinfo.cz/");
         defaultConfig.setProperty("campaignId", 4);
-        defaultConfig.setProperty("limit", 200);
-        defaultConfig.setProperty("interval", 12);
-        defaultConfig.setProperty("allowedStations", Collections.singletonList(1305167563014004L));
+        defaultConfig.setProperty("actionId", 1);
+        defaultConfig.setProperty("entityId", 1);
+        defaultConfig.setProperty("allowedStations", Arrays.asList(1305167563014004L, 1305167563048283L));
+
 
         SensLogTelemetryConfig config = new SensLogTelemetryConfig(defaultConfig);
         SensLogTelemetryFetcher fetcher = new SensLogTelemetryFetcher(config, HttpClient.newHttpSSLClient());
-        SensLogTelemetryProxySession proxySession = new SensLogTelemetryProxySession(fetcher);
-        ExecutableFetcher<GeoJsonModel> executor = ExecutableFetcher.createWithProxySession(proxySession);
+        ExecutableFetcher<GeoJsonModel> executor = ExecutableFetcher.create(fetcher);
 
         fetcher.init();
         for (int i = 0; i < 10; i++) {

+ 2 - 5
connector-push-theros/src/main/java/cz/senslog/connector/push/theros/TherosPusher.java

@@ -48,10 +48,7 @@ public class TherosPusher implements ConnectorPusher<GeoJsonModel> {
             logger.warn("Nothing to push."); return;
         }
 
-        List<JsonElement> geoFeatures = model.getGeoJson().getAsJsonArray("features").asList();
-        geoFeatures.forEach(feature -> feature.getAsJsonObject().get("properties").getAsJsonObject()
-                        .addProperty("lotNumber", "X1234345")
-                );
+        int featuresToPush = model.getGeoJson().getAsJsonArray("features").size();
 
         AuthorizationToken token = authService.getAuthorizationToken();
         HttpRequest request = HttpRequest.newBuilder().POST()
@@ -66,7 +63,7 @@ public class TherosPusher implements ConnectorPusher<GeoJsonModel> {
         if (response.isOk()) {
             JsonObject geoJson = BasicJson.jsonToObject(response.getBody(), JsonObject.class);
             int uploadedFeatures = geoJson.get("features").getAsJsonArray().size();
-            logger.info("Send telemetries {}/{} from {} to {}.", geoFeatures.size(), uploadedFeatures, model.getFrom(), model.getTo());
+            logger.info("Send telemetries {}/{} from {} to {}.", featuresToPush, uploadedFeatures, model.getFrom(), model.getTo());
         } else {
             logger.error("Can not send telemetries from {} to {}.", model.getFrom(), model.getTo());
             logger.error(response.getBody());