Fine Offset Weather Station Binding: Discussion

This is not the most current version.

The version with the support of ELV devices is currently only available via the OpenHAB 3.4. nightly build or as snapshot from the build server

I jumped over to openhab unstable which should be pulling snapshots now.

Information
* Source
openHAB Distribution
* Provided By
openHAB*checkmark_seal_fill*
* Version
3.4.0.SNAPSHOT
* Type
binding
* Content Type
Karaf Feature
* Provisioned With
Karaf

I’m still getting this:

2022-08-22 22:14:51.019 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'fineoffsetweatherstation:gateway:3170848015' changed from OFFLINE (COMMUNICATION_ERROR): Read timed out to ONLINE
2022-08-22 22:14:56.024 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'fineoffsetweatherstation:gateway:3170848015' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Read timed out
2022-08-22 22:15:12.078 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'fineoffsetweatherstation:gateway:3170848015' changed from OFFLINE (COMMUNICATION_ERROR): Read timed out to ONLINE

My trace info. I switched over to ELV during this:

openhab> log:tail org.openhab.binding.fineoffsetweatherstation
22:29:23.027 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:29:44.044 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:30:05.108 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:30:24.569 [DEBUG] [ineOffsetWeatherStationHandlerFactory] - bundle org.openhab.binding.fineoffsetweatherstation:3.4.0.202208220338 (280)[org.openhab.binding.fineoffsetweatherstation.internal.FineOffsetWeatherStationHandlerFactory(342)] : Querying state active
22:30:24.570 [DEBUG] [ery.FineOffsetGatewayDiscoveryService] - bundle org.openhab.binding.fineoffsetweatherstation:3.4.0.202208220338 (280)[org.openhab.binding.fineoffsetweatherstation.internal.discovery.FineOffsetGatewayDiscoveryService(343)] : Querying state active
22:30:26.307 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:30:47.408 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:31:08.420 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:31:29.433 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:31:50.480 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:32:11.536 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:32:32.567 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:32:53.775 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:33:14.961 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:33:36.158 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:33:43.887 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_READ_FIRMWARE_VERSION): send request: FFFF500353
22:33:43.897 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_READ_FIRMWARE_VERSION): received: FFFF501410414D425765617468657256342E332E33
22:33:48.926 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:34:09.957 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:34:31.166 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:34:52.388 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:35:13.512 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:35:34.738 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:35:42.726 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_READ_FIRMWARE_VERSION): send request: FFFF500353
22:35:42.733 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_READ_FIRMWARE_VERSION): received: FFFF501410414D425765617468657256342E332E33
22:35:47.805 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:36:08.850 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:36:28.237 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - sendBroadcastPacket: send request: FFFF12000416
22:36:28.551 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - Received 45 bytes response from 192.168.10.110:46000 on Port 39617
22:36:28.553 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - Discovery response received: FFFF12002BBCFF4D0FE781C0A80A6EAFC81A414D42576561746865722D57494649453738312056342E332E337A
22:36:28.555 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - Thread Thread[Thread-170,5,main] waiting for data on port 39617
22:36:28.559 [TRACE] [service.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): send request: FFFF27032A
22:36:33.243 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - sendBroadcastPacket: send request: FFFF120315
22:36:33.566 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - found 0 measured values via protocol DEFAULT
22:36:33.569 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:36:38.646 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:36:43.652 [TRACE] [ery.FineOffsetGatewayDiscoveryService] - found 0 measured values via protocol ELV
22:36:43.658 [DEBUG] [ery.FineOffsetGatewayDiscoveryService] - Thing discovered 'DiscoveryResult [thingUID=fineoffsetweatherstation:gateway:3170848015, properties={macAddress=BC:FF:4D:0F:E7:81, port=45000, ip=192.168.10.110}, representationProperty=macAddress, flag=NEW, label=Weather Station, bridgeUID=null, ttl=-1, timestamp=1661225803655]'
22:36:54.616 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:37:15.630 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:37:36.737 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:37:57.903 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:38:19.099 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:38:40.153 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:39:01.532 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419
22:39:22.685 [TRACE] [ternal.service.ELVGatewayQueryService] - executeCommand(CMD_WS980_LIVEDATA): send request: FFFF0B0006040419

Does the WS-View APP work for your device?

It doesn’t seem so. I can see the station in the app, and can set it up with my OpenHab URL, and it’s working with the Wunderground Update Receiver Binding protocol. The WS View app doesn’t show any real time data. All of the fields are blank. I’ve tried it without any cloud connections as well.
Perhaps this unit doesn’t support the wire protocol? I did update the firmware as one of the first things I did.

Is there a bash script, maybe using expect with a bunch of telnet commands that would test the wire interface?

  1. Does the WS-View Plus app work with your device?
  2. I saw that there is an awnet APP which seems like a modified WS-View-APP, with the following java program you can simulate a second gateway which proxies all request to your WS-2902C. Please try this one, with the app and provide me the output.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;


public class Proxy {
    private static final int DISCOVERY_PORT = 46000;
    // switch for different protocols
    private static final boolean USE_BIG_SIZE = true;

    static class Broadcast extends Thread {
        private final String ssid;
        private final InetAddress host;
        private final int port;

        public Broadcast(String ssid, InetAddress host, int port) {
            this.ssid = ssid;
            this.host = host;
            this.port = port;
        }

        @Override
        public void run() {
            try (DatagramSocket socket = new DatagramSocket(DISCOVERY_PORT)) {
                byte[] buf = new byte[50];
                DatagramPacket request = new DatagramPacket(buf, buf.length);
                while (true) {
                    socket.receive(request);
                    System.out.println("Broadcast received " + toHexString(request.getData(), request.getLength()));

                    int offset = 0;
                    int size = 16 + ssid.length();
                    if (USE_BIG_SIZE) {
                        size++;
                        offset++;
                    }
                    byte[] data = new byte[size + 2];
                    data[0] = (byte) 0xFF;
                    data[1] = (byte) 0xFF;
                    data[2] = (byte) 0x12;
                    if (USE_BIG_SIZE) {
                        data[3] = (byte) (size >> 8 & 0xFF);
                        data[4] = (byte) (size & 0xFF);
                    } else {
                        data[3] = (byte) (size & 0xFF);
                    }
                    System.arraycopy(host.getAddress(), 0, data, 10 + offset, 4);
                    data[14 + offset] = (byte) (port >> 8 & 0xFF);
                    data[15 + offset] = (byte) (port & 0xFF);
                    data[16 + offset] = (byte) ssid.length();
                    System.arraycopy(ssid.getBytes(), 0, data, 17 + offset, ssid.length()); // SSID
                    data[size + offset] = sum(data, 2, size);

                    InetSocketAddress addr = new InetSocketAddress(request.getAddress(), request.getPort());


                    DatagramPacket datagramPacket = new DatagramPacket(data, data.length, addr);
                    socket.send(datagramPacket);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        DiscoveryData discoveryData = discoverWeatherStation();
        if (discoveryData == null) {
            System.err.println("No device found");
            return;
        }
        new Broadcast(discoveryData.name + "-Proxy", discoveryData.host, discoveryData.port).start();
        try (ServerSocket serverSocket = new ServerSocket(discoveryData.port)) {
            Socket s2 = new Socket(discoveryData.ip, discoveryData.port);
            while (true) {
                try {
                    Socket s1 = serverSocket.accept();
                    new Client(s1, s2, "Req ").start();
                    new Client(s2, s1, "Resp").start();
                } catch (IOException e) {
                    System.out.println("Client connection error: " + e.getMessage());
                }
            }
        }
    }

    private static DiscoveryData discoverWeatherStation() {
        byte[] msg1 = new byte[]{(byte) 0xff, (byte) 0xff, 0x12, 0, 4, 0x16};
        byte[] msg2 = new byte[]{(byte) 0xff, (byte) 0xff, 0x12, 3, 0x15};
        byte[] data = new byte[255];
        DatagramPacket receivePacket = new DatagramPacket(data, data.length);
        try {
            return Collections.list(NetworkInterface.getNetworkInterfaces())
                    .stream()
                    .map(NetworkInterface::getInterfaceAddresses)
                    .flatMap(Collection::stream)
                    .filter(interfaceAddress -> {
                        final InetAddress addr = interfaceAddress.getAddress();
                        return addr instanceof Inet4Address
                                && !addr.isLinkLocalAddress()
                                && !addr.isLoopbackAddress()
                                && interfaceAddress.getBroadcast() != null;
                    })
                    .map(interfaceAddress -> {
                        InetSocketAddress broadcastAddress = new InetSocketAddress(interfaceAddress.getBroadcast(), DISCOVERY_PORT);

                        System.out.println("Try to discover on " + broadcastAddress);
                        for (byte[] msg : new byte[][]{msg1, msg2}) {
                            try (DatagramSocket socket = new DatagramSocket()) {
                                socket.setReuseAddress(true);
                                socket.setBroadcast(true);
                                socket.setSoTimeout(1000);

                                socket.send(new DatagramPacket(msg, msg.length, broadcastAddress));
                                socket.receive(receivePacket);
                                byte[] messageBuf = Arrays.copyOfRange(receivePacket.getData(), receivePacket.getOffset(),
                                        receivePacket.getOffset() + receivePacket.getLength());
                                String ip = InetAddress.getByAddress(Arrays.copyOfRange(messageBuf, 11, 15)).getHostAddress();
                                var port = (Byte.toUnsignedInt(messageBuf[15]) << 8 | Byte.toUnsignedInt(messageBuf[15 + 1]));
                                var len = Byte.toUnsignedInt(messageBuf[17]);
                                String name = new String(messageBuf, 18, len);
                                System.out.println("Found device '" + name + "' at " + ip + ":" + port + " via " + interfaceAddress.getAddress());
                                return new DiscoveryData(name, port, InetAddress.getByName(ip), interfaceAddress.getAddress());
                            } catch (SocketTimeoutException ignored) {
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        return null;
                    })
                    .filter(Objects::nonNull)
                    .findFirst()
                    .orElse(null);
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }
    }

    private static byte sum(byte[] data, int start, int end) {
        byte checksum = 0;
        for (var i = start; i <= end; i++) {
            checksum += data[i];
        }
        return checksum;
    }

    static class Client extends Thread {
        Socket s1;
        Socket s2;
        private final String name;

        Client(Socket s1, Socket s2, String name) throws IOException {
            this.s1 = s1;
            this.s2 = s2;
            this.name = name;
        }

        public void run() {
            try {
                InputStream is = s1.getInputStream();
                OutputStream os = s2.getOutputStream();
                byte[] buf = new byte[1024];
                int len;
                while ((len = is.read(buf)) != -1) {

                    String data = toHexString(buf, len);
                    System.out.println(name + " " + len + "\t" + data);
                    os.write(buf, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static String toHexString(byte[] hex, int length) {
        String[] hexadecimal = new String[length];
        for (int i = 0; i < length; i++) {
            hexadecimal[i] = String.format("%02X", hex[i]);
        }
        return String.join("", hexadecimal);
    }

    private static class DiscoveryData {
        String name;
        int port;
        InetAddress ip;
        InetAddress host;

        public DiscoveryData(String name, int port, InetAddress ip, InetAddress host) {
            this.name = name;
            this.port = port;
            this.ip = ip;
            this.host = host;
        }
    }
}

ensure to adjust the constants to your environment

@Billj can you please give feedback if this binding is working for your device?

@Andy2003 I loaded the updated binding and there was no change.

When I run the app on my phone I get all data except for rain. When I select the more option and select rain I just get a screen with no data. I thought this was because it was not raining however last night we had rain and it was the same as I poster before, no values.

I have built a new Raspberry Pi I am testing this on and will work on the Java programe to see if I get that to compile.
Bill

Hey @Andy2003 , I tossed the 3.4 snapshot into my 3.3 system but got a heap of exceptions and no Battery Voltage channel…

2022-08-24 12:12:53.759 [INFO ] [org.apache.felix.fileinstall        ] - Installing bundle org.openhab.binding.fineoffsetweatherstation / 3.4.0.202208231707
2022-08-24 12:12:53.889 [ERROR] [neOffsetWeatherStationHandlerFactory] - bundle org.openhab.binding.fineoffsetweatherstation:3.4.0.202208231707 (310)[org.openha
b.binding.fineoffsetweatherstation.internal.FineOffsetWeatherStationHandlerFactory(379)] : Error during instantiation of the implementation object
java.lang.IllegalArgumentException: argument type mismatch
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?]
        at org.apache.felix.scr.impl.inject.internal.ComponentConstructorImpl.newInstance(ComponentConstructorImpl.java:316) ~[bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:286) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:115) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:1000) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:973) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:918) [bundleFile:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:220) [org.eclipse.osgi-3.17.200.jar:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:217) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:118) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:48) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:547) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:533) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:655) [org.eclipse.osgi-3.17.200.jar:?]
        at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:88) [bundleFile:?]
        at org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:675) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2556) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.DependencyManager.doInvokeBindMethod(DependencyManager.java:2075) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:2058) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeBindMethod(SingleComponentManager.java:443) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:333) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:301) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1200) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1121) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:928) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:864) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1152) [bundleFile:?]
        at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:114) [bundleFile:?]
        at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:120) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:956) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:936) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:873) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:141) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:261) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:495) [org.eclipse.osgi-3.17.200.jar:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437) [bundleFile:?]
        at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:667) [bundleFile:?]
        at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:305) [bundleFile:?]
        at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:554) [bundleFile:?]
        at org.apache.felix.scr.impl.Activator.access$200(Activator.java:70) [bundleFile:?]
        at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:421) [bundleFile:?]
        at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196) [bundleFile:?]
        at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169) [bundleFile:?]
        at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49) [bundleFile:?]
        at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:488) [osgi.core-7.0.0.jar:?]
        at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:420) [osgi.core-7.0.0.jar:?]
        at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [osgi.core-7.0.0.jar:?]
        at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:450) [osgi.core-7.0.0.jar:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:944) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:229) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:138) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:130) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:217) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.container.Module.publishEvent(Module.java:499) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.container.Module.start(Module.java:486) [org.eclipse.osgi-3.17.200.jar:?]
        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:445) [org.eclipse.osgi-3.17.200.jar:?]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1260) [bundleFile:3.7.4]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1233) [bundleFile:3.7.4]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:520) [bundleFile:3.7.4]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365) [bundleFile:3.7.4]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316) [bundleFile:3.7.4]
2022-08-24 12:12:53.892 [WARN ] [g.discovery.internal.PersistentInbox] - bundle org.openhab.core.config.discovery:3.3.0 (161)[org.openhab.core.config.discovery.internal.PersistentInbox(122)] : Could not get service from ref {org.openhab.core.thing.binding.ThingHandlerFactory}={service.id=655, service.bundleid=310, service.scope=bundle, component.name=org.openhab.binding.fineoffsetweatherstation.internal.FineOffsetWeatherStationHandlerFactory, component.id=379}
2022-08-24 12:12:53.892 [WARN ] [g.discovery.internal.PersistentInbox] - bundle org.openhab.core.config.discovery:3.3.0 (161)[org.openhab.core.config.discovery.internal.PersistentInbox(122)] : DependencyManager : invokeBindMethod : Service not available from service registry for ServiceReference {org.openhab.core.thing.binding.ThingHandlerFactory}={service.id=655, service.bundleid=310, service.scope=bundle, component.name=org.openhab.binding.fineoffsetweatherstation.internal.FineOffsetWeatherStationHandlerFactory, component.id=379} for reference ThingHandlerFactory

Hi Andreas, Sorry I just discovered that there is a Plus version of the app. I was using WS View. I loaded WSView Plus and it does show my Piezo Rain. I still don’t see rain as an option in the binding. I finally have the proxy working. The old app connects and generates logs but at various time has a Java Broken pipe error. I have tried to use the new app and point it to the proxy. It looks like as soon as it connects the App bypasses the proxy and connects directly. I put the proxy IP address in to start. The proxy generates these lines:

openhabian@NCC-1717:~ $ java Proxy
Req 5 FFFF500353
Resp 20 FFFF50120E475732303030435F56322E312E37BE
Req 5 FFFF260329
Resp 11 FFFF2609943CC692B04B52
Req 5 FFFF500353
Resp 20 FFFF50120E475732303030435F56322E312E37BE

Then nothing but I can see the app updating. when I check the Ip is has changed to Server ip that the app would discover. Not sure if this is any help.
Bill

Please can you try with the 3.4.0-SNAPSHOT build of OpenHab, this should already have the updated binding included, so you need to remove the one from the addons folder.

Can you please retry with the improved proxy. This should show up the proxy itself as a discovered device.

I might wait for 3.4 stable release, as any instability in my OH system is exploited by my wife as a reason to dumb down the house!!

Thanks Andreas, Teaching an old dog new tricks is hard. I rebuilt my test Pi again just to be sure it was not me. Compiled the new java. It connected as expected and provided a second Device on my iPhone device list -proxy. I can’t select it to get to the next screen.
The direct one works but I ca’t get the Proxy to show data. This is the proxy output:
bill@Discovery:~ $ java Proxy
Try to discover on /192.168.0.255:46000
Found device ‘GW2000C-WIFIB04B V2.1.7’ at 192.168.0.80:45000 via /192.168.0.232
Broadcast received FFFF12000416
Broadcast received FFFF12000416

The Proxy is Pi 4 at .232 and is connected via eth
The GW2000C is .80 and connected via eth also.

Thanks Bill

To test it, you can setup a second instance (e.g. on your PC). I have also 2 versions of OpenHAB running in parallel.

The WSView Plus app is sensitive to the SSID of the gateway. It is parsing the name to dis-/enable different features.
As soon the name contains GW2000 it tries to connect to port 80 on your device. Since the Proxy has no open port 80 it fails to connect.

So there are 2 possibilities:

  1. change the name of the SSID, so no port 80 is queried.
  2. proxy port 80 as well (you need to have root privilege on linux for this)

Let’s try the fist approach first, by replacing:

with

new Broadcast("WH2650A-WIFID25E Proxy V1.7.5", discoveryData.host, discoveryData.port).start();`

@Andy2003 Brought up a new openhab instance on the snapshot release and it looks good, the only thing I did notice is that on my WH34 Temp probe, openhab has the voltage of 1.6V but on ecowitt.net (as the app only shows a graphic not values) it reads 1.58V

Trace below

2022-08-27 01:32:53.316 [TRACE] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SENSOR_ID_NEW): send request: FFFF3C033F
2022-08-27 01:32:53.328 [TRACE] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SENSOR_ID_NEW): received: FFFF3C015400000000CD000401FFFFFFFFFF0002FFFFFFFFFF0003FFFFFFFF1F0005FFFFFFFF000006FFFFFFFF000007FFFFFFFF000008FFFFFFFF000009FFFFFFFF00000AFFFFFFFF00000BFFFFFFFF00000CFFFFFFFF00000DFFFFFFFF00000E000111C50D040F000112080F0410000111D61F0011000110A30F0412000111170F0413FFFFFFFF1F0014FFFFFFFF1F0015FFFFFFFF1F00160000C4E7060417FFFFFFFE0F0018FFFFFFFE0F0019FFFFFFFE0F001AFFFFFFFF0F001BFFFFFFFF0F001CFFFFFFFF0F001DFFFFFFFF0F001EFFFFFFFF0F001F000030494F0420FFFFFFFFFF0021FFFFFFFFFF0022FFFFFFFFFF0023FFFFFFFFFF0024FFFFFFFFFF0025FFFFFFFFFF0026FFFFFFFFFF0027FFFFFFFF0F0028FFFFFFFFFF0029FFFFFFFFFF002AFFFFFFFFFF002BFFFFFFFFFF002CFFFFFFFFFF002DFFFFFFFFFF002EFFFFFFFFFF002FFFFFFFFFFF0030FFFFFFFFFF00E5
2022-08-27 01:32:53.328 [TRACE] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SSSS): send request: FFFF300333
2022-08-27 01:32:53.341 [TRACE] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SSSS): received: FFFF300B0001630982542F02AF

Hi Andreas, You are a legend that worked and I was able to capture the Following.
Let me know if you need more I didn’t want to flood here with data.
Regards
Bill

bill@Discovery:~ $ java Proxy
Try to discover on /192.168.0.255:46000
Found device 'GW2000C-WIFIB04B V2.1.7' at 192.168.0.80:45000 via /192.168.0.232
Broadcast received FFFF12000416
Broadcast received FFFF12000416
Req  5  FFFF500353
Resp 20 FFFF50120E475732303030435F56322E312E37BE
Req  5  FFFF27032A
Resp 56 FFFF2700360100B1064808280E09280E0200A207610A00B50B00050C000815000209E01600001700620000000061FFFFFFFF60FF19001F4C
Req  5  FFFF3C033F
Resp 349        FFFF3C015B00FFFFFFFFFF0001FFFFFFFFFF0002FFFFFFFFFF0003FFFFFFFF1F0004FFFFFFFF000005FFFFFFFF000006FFFFFFFF000007FFFFFFFF000008FFFFFFFF000009FFFFFFFF00000AFFFFFFFF00000BFFFFFFFF00000CFFFFFFFF00000DFFFFFFFF00000EFFFFFFFF1F000FFFFFFFFF1F0010FFFFFFFF1F0011FFFFFFFF1F0012FFFFFFFF1F0013FFFFFFFF1F0014FFFFFFFF1F0015FFFFFFFF1F0016FFFFFFFF0F0017FFFFFFFF0F0018FFFFFFFF0F0019FFFFFFFF0F001A0000EAC705041BFFFFFFFF0F001CFFFFFFFF0F001DFFFFFFFF0F001EFFFFFFFF0F001FFFFFFFFFFF0020FFFFFFFFFF0021FFFFFFFFFF0022FFFFFFFFFF0023FFFFFFFFFF0024FFFFFFFFFF0025FFFFFFFFFF0026FFFFFFFFFF0027FFFFFFFF0F0028FFFFFFFFFF0029FFFFFFFFFF002AFFFFFFFFFF002BFFFFFFFFFF002CFFFFFFFFFF002DFFFFFFFFFF002EFFFFFFFFFF002FFFFFFFFFFF00300000282EA404B7
Req  5  FFFF57035A
Resp 59 FFFF5700398000008300000009840000000985000000C786000000C7810000870064006400640064006400640064006400640064880900007A02BF
Req  5  FFFF27032A
Resp 56 FFFF2700360100B1064808280E09280E0200A207610A00A00B00090C00091500020E901600001700620000000061FFFFFFFF60FF19001FF1
Req  5  FFFF3C033F
Resp 349        FFFF3C015B00FFFFFFFFFF0001FFFFFFFFFF0002FFFFFFFFFF0003FFFFFFFF1F0004FFFFFFFF000005FFFFFFFF000006FFFFFFFF000007FFFFFFFF000008FFFFFFFF000009FFFFFFFF00000AFFFFFFFF00000BFFFFFFFF00000CFFFFFFFF00000DFFFFFFFF00000EFFFFFFFF1F000FFFFFFFFF1F0010FFFFFFFF1F0011FFFFFFFF1F0012FFFFFFFF1F0013FFFFFFFF1F0014FFFFFFFF1F0015FFFFFFFF1F0016FFFFFFFF0F0017FFFFFFFF0F0018FFFFFFFF0F0019FFFFFFFF0F001A0000EAC705041BFFFFFFFF0F001CFFFFFFFF0F001DFFFFFFFF0F001EFFFFFFFF0F001FFFFFFFFFFF0020FFFFFFFFFF0021FFFFFFFFFF0022FFFFFFFFFF0023FFFFFFFFFF0024FFFFFFFFFF0025FFFFFFFFFF0026FFFFFFFFFF0027FFFFFFFF0F0028FFFFFFFFFF0029FFFFFFFFFF002AFFFFFFFFFF002BFFFFFFFFFF002CFFFFFFFFFF002DFFFFFFFFFF002EFFFFFFFFFF002FFFFFFFFFFF00300000282EA404B7
Req  5  FFFF57035A
Resp 59 FFFF5700398000008300000009840000000985000000C786000000C7810000870064006400640064006400640064006400640064880900007A02BF
Req  5  FFFF27032A
Resp 56 FFFF2700360100B1064808280E09280E0200A207610A00AE0B00060C000A150002146C1600631701620000000061FFFFFFFF60FF19001F43
Req  5  FFFF3C033F
Resp 349  

The data parsed by the binding meet your expectations:

My guess is that the item in OpenHAB is configured in such a way that only one fractional digit is displayed.

Perfect! I have found a conversion issue. The current build should work with your device now! Please test it and give me feedback?