Fine Offset Weather Station Binding: Discussion

Hi Andreas,
Thanks again for the help. I loaded the script and and adjusted the ip address. When I run Node js it chucks out errors so it could be a while until I get you the output you need just so you know I am working through it.
Bill

Here is a later spec that includes the additional fields for the Piezo rain sensor.

When I run Node js it chucks out errors

you need to compile and run this code with java

Here is a later spec that includes the additional fields for the Piezo rain sensor.

Thank you very much, this was very helpful!

@Billj I created a PR to read out the piezo rain data as well, can you please test the binding, if it works for you?

cc @Joerg_Schreiner

yes it will be supported, when PR mentioned above will be merged

This is also how the binding is determining the bateryLevel and lowBattery

The WH51 is not binary but has also a level, according to spec and implementation of this binding

I created a PR to add a new channel for the batteryLevel.

Unfortunately only the latest build is published in the artifactory, so there is no build to test right now

Since this PR was merged both changes can now be tested by adding the jar to the addons folder

I just bought the Ambient Weather WS-2902C WiFi Smart Weather Station off Amazon.
I have it paired to the nice LCD bridge device, and I can nmap my network and see that itā€™s on port 45000.
I installed this binding date May 9, 5:45am, and am getting the error already described earlier in this thread. Do I need to manually install a jar?

2022-08-22 08:57:18.048 [WARN ] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SENSOR_ID_NEW): failed to invoke command
2022-08-22 08:57:23.069 [WARN ] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SSSS): failed to invoke command
2022-08-22 08:57:23.073 [INFO ] [ervice.FineOffsetGatewayQueryService] - Unexpected response to System Info!
2022-08-22 08:57:28.100 [WARN ] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_READ_SENSOR_ID_NEW): failed to invoke command
2022-08-22 08:57:33.116 [WARN ] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): failed to invoke command
2022-08-22 08:57:54.137 [WARN ] [ervice.FineOffsetGatewayQueryService] - executeCommand(CMD_GW1000_LIVEDATA): failed to invoke command

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!!